用包含const成员的struct实例替换堆栈与静态变量

时间:2011-11-14 03:10:10

标签: c++ static

使用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时却不起作用?

1 个答案:

答案 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在初始化时被赋予一个新值。