C++ 用包含常量成员的结构实例替换堆栈与静态变量
使用gcc版本4.4.3,如下所示: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 -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();