[英]What is the GCC option for disabling assignment operator optimizations
让我们从这个小例子开始:
#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中,存储在容器中的类型需要为CopyConstructible
和Assignable
。 在C ++ 11中,放宽了要求并将其应用于在容器上执行的操作。
class A
必须是CopyConstructible
和Assignable
因为它存储在vector
这就是为什么需要public operator=
int main(void) {
vector<A> v;
v = { A() }; // Copy Constructor
A x;
x = v[0]; // operator=
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.