使用gcc版本4.4.3如下:
gcc -g -x c++ -lstdc++ -std=c++98 -o ./main ./main.cpp
main.cpp中的这段代码编译得很好:
#include <iostream>
struct A
{
A()
: m_flag(false)
{
}
const bool m_flag;
};
static A aa = A();
int main(int argc, char* argv[])
{
A a;
// Not static = copy OK
A b( a );
A c = b;
A d = A();
// Static = copy not OK
// aa = A();
}
但如果我取消注释aa = A();
,我会得到:
./main.cpp: In member function 'A& A::operator=(const A&)':
./main.cpp:4: error: non-static const member 'const bool A::m_flag', can't use default assignment operator
./main.cpp: In function 'int main(int, char**)':
./main.cpp:24: note: synthesized method 'A& A::operator=(const A&)' first required here
为什么默认的复制构造和复制赋值对堆栈上的副本起作用,但在用副本替换非const static
时却不起作用?
答案 0 :(得分:4)
问题在于这一行:
const bool m_flag;
...
aa = A(); // invokes 'A::operator =(const A&)`
调用默认operator =
。修改const
成员是一个微不足道的错误。
A b( a ); // all invoke `A::A(const A&)`
A c = b;
A d = A();
调用默认的复制构造函数(而不是operator =
),其中m_flag
在初始化时被赋予一个新值。