考虑以下代码:
struct s
{
const int id;
s(int _id):
id(_id)
{}
};
// ...
vector<s> v; v.push_back(s(1));
我收到“const int id”无法使用默认赋值运算符的编译器错误。
<罢工>Q1。为什么 push_back() 需要赋值运算符?
A1.因为当前的 c++ 标准是这么说的。
<罢工>Q2。我该怎么办?
- 我不想放弃 const 说明符
- 我要复制数据
<罢工>罢工> A2。我将使用智能指针。
Q3。我想出了一个“解决方案”,这看起来相当疯狂:
s& operator =(const s& m)
{
if(this == &m) return *this;
this->~s();
return *new(this) s(m);
}
我应该避免这种情况吗?为什么(如果是这样)? 如果对象在堆栈上,使用 placement new 是否安全?
最佳答案
C++03 要求存储在容器中的元素是CopyConstructible
和Assignable
(参见§23.1)。因此,实现可以决定使用他们认为合适的复制构造和赋值。这些约束在 C++11 中放宽了。明确地,push_back
操作要求是类型是CopyInsertable
到 vector 中(参见§23.2.3 序列容器)
此外,C++11 容器可以在插入操作和 do on 中使用移动语义。
关于c++ - 使用 const 成员分配类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601998/