gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:36 24 4
gpt4 key购买 nike

使用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

为什么默认的拷贝构造和拷贝分配适用于堆栈上的拷贝,但在用拷贝替换非常量 static 时却不起作用?

最佳答案

问题是这一行:

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

关于c++ - 用包含 const 成员的结构实例替换堆栈与静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8116880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com