我被困在一个旧的编译器中,它既不支持 std::move 也不支持其他 c++11 功能,并且有以下场景:
struct MyStruct
{
const int32_t value1;
const int32_t value2;
MyStruct(int32_t value1, int32_t value2); //Initializing constructor.
}
现在我有一个 std::vector,它采用上述结构,但我的编译器善意地通知我:
non-static const member ... can't use default assignment operator
。
这反过来表明,出于某种原因, std::vector 确实不使用复制构造函数,而这将是正确的做法。
知道如何解决这个问题吗?
因为
MyStruct &MyStruct::operator =(const MyStruct &other)
{
if (&other != this)
*this = MyStruct(other);
return *this;
}
感觉这是一种非常容易出现错误的解决问题的方法。 达到同一目的的另一种想法如下所示:
MyStruct &MyStruct::operator =(const MyStruct &other)
{
*const_cast<int32_t *>(&value1) = other.value1;
*const_cast<int32_t *>(&value2) = other.value2;
return *this;
}
我真的不确定,我不太喜欢哪种方法。
我已获悉,C++11 之前的 std::vector 元素需要“可复制分配”(如 https://en.cppreference.com/w/cpp/container/vector 中所述) .
为了解决我的问题,我最终使用了不同的容器:std::list(只需要复制可构造元素)。
感谢那些帮助我绕过墙壁而不是试图突破的人。