c++ - 使用 const 成员分配类

标签 c++ vector constants assignment-operator placement-new

考虑以下代码:

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 要求存储在容器中的元素是CopyConstructibleAssignable(参见§23.1)。因此,实现可以决定使用他们认为合适的复制构造和赋值。这些约束在 C++11 中放宽了。明确地,push_back 操作要求是类型是CopyInsertable 到 vector 中(参见§23.2.3 序列容器)

此外,C++11 容器可以在插入操作和 do on 中使用移动语义。

关于c++ - 使用 const 成员分配类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601998/

相关文章:

c++ - 我只想获得高质量的特征点

c++ - MacBook Pro 中的 std::cout 窗口在哪里?

c++ - 指针 vector 和值 vector 之间的差异

constants - 生成 uuid 并在 Airflow DAG 中使用它

c++ - 2D线段树,矩形之和

c++ - 如何派生/扩展递归类

c++ - 对 2dim vector 进行排序并保留索引

c++如何使函数(子例程)参数成为 double vector 或整数 vector

javascript - 所以我使用 Javascript const 关键字,在 IE 中会发生什么?

c++ - 为实例变量(即对象)调用 getter 函数时实际发生了什么?