c++ - 禁用赋值运算符优化的 GCC 选项是什么

标签 c++ gcc assignment-operator

让我们从这个小例子开始:

#include <vector>
#include <iostream>

using namespace std;

class A {
private:
    A& operator =(const A&);
};

int main(void) {
    vector<A> v;
    v = { A() };
    return 0;
}

此代码的编译失败并显示错误消息 error: ‘A& A::operator=(const A&)’ is private。我不知道为什么它需要赋值运算符所以我试图找出并将代码更改为:

#include <vector>
#include <iostream>

using namespace std;

class A {
public:
    A& operator =(const A& a) { cout << "operator=" << endl; return *this; }
};

int main(void) {
    vector<A> v;
    v = { A() };
    return 0;
}

现在代码可以编译,但是当我执行它时,它不会在赋值运算符实现中输出调试消息。

所以编译器想要赋值运算符但没有使用它?我猜编译器以某种方式优化了分配。就像它优化了移动构造函数的使用一样(可以使用选项 -no-elide-constructors 来阻止)。是否有可以防止分配优化的编译器选项?或者是否有不同的解释为什么编译器想要一个可访问的赋值运算符但在运行时不使用它?

最佳答案

在 C++03 中,存储在容器中的类型需要是 CopyConstructibleAssignable。在 C++11 中,要求放宽并适用于在容器上执行的操作。

class A 需要是 CopyConstructibleAssignable 因为存储在 vector 这就是为什么你需要 public operator=

int main(void) {
    vector<A> v;
    v = { A() }; // Copy Constructor

    A x;
    x = v[0]; // operator=
    return 0;
}

关于c++ - 禁用赋值运算符优化的 GCC 选项是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24752270/

相关文章:

c++ - C2371错误: redefinition; different basic types

c++ - 使用 openGL(插值)清楚地缩放 Bitmapfont?

c - 为什么我无法通过整数加法获得最佳性能?

c++ - 复制构造函数和复制赋值运算符应该有相同的语句吗?

c++ - 分配运算符(operator)在圆形双向链表中无法正常工作

c++ - GCC 选项 : warning on non-void functions without a return statement

c++ - 设置一个 for 循环循环直到检测到空字节

macos - 在 Mac 上构建 gcc 时遇到问题 - 找不到系统 header

c - alloca inside 复合语句

java - 简写赋值运算符,+=,真正的意思?