【发布时间】:2012-07-21 01:36:38
【问题描述】:
考虑以下代码:
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。我将使用智能指针。
第三季度。我想出了一个看起来相当疯狂的“解决方案”:
s& operator =(const s& m)
{
if(this == &m) return *this;
this->~s();
return *new(this) s(m);
}
我应该避免这种情况,为什么(如果是)? 如果对象在堆栈上,使用placement new 是否安全?
【问题讨论】:
-
关于#1,它是一个动态数组。它必须复制(或移动)元素。
-
&chris 那是我没有得到的部分,它应该复制而不是分配
-
你可以启用C++11,代码会编译。
-
对于Q3:你必须绝对检查自赋值,然后在
new调用之前说this->~s();(因为它是UB覆盖析构函数非平凡的对象的内存)... 但我不确定您是否可以在其自己的成员函数中销毁对象。 -
如果您希望在复制分配期间复制您的数据成员,那么声明它
const没有任何意义。为什么要const或者为什么不想放弃const?
标签: c++ vector constants assignment-operator placement-new