C++ 用包含常量成员的结构实例替换堆栈与静态变量

C++ 用包含常量成员的结构实例替换堆栈与静态变量,c++,static,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* arg

使用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();
}

为什么默认的副本构造和副本分配适用于堆栈上的副本,但在用副本替换非常量
静态
时不起作用?

问题是这一行:

 const bool m_flag;
 ...
 aa = A();  // invokes 'A::operator =(const A&)`
调用默认的
操作符=
。修改
const
成员是一个很小的错误

A b( a );   // all invoke `A::A(const A&)`
A c = b;  
A d = A(); 

调用默认的复制构造函数(不是您假定的
operator=
),其中
m_flag
在初始化时被分配一个新的值。

默认的赋值运算符在您的程序中永远不会被调用,失败行除外。您认为默认赋值运算符在哪一行被成功调用?+1用于提供演示您所描述问题的最小完整程序。有关更多信息,请参阅。我当然希望您不要一直这样调用g++……看起来非常麻烦(除非它是由make系统生成的,这看起来也很奇怪)。
A b( a );   // all invoke `A::A(const A&)`
A c = b;  
A d = A();