C++中A a = A()时a.ptr是否恒等于&a?是否符合标准?
关于C++中
A a = A()初始化后a.ptr == &a是否恒成立的问题 先明确场景代码:
class A { public: A* ptr; A() : ptr(this) {} }; // 目标初始化语句 A a = A();
核心结论:a.ptr == &a并非始终成立,这取决于编译器是否执行拷贝消除优化,而该优化是标准允许但不强制要求的。
具体分析:
- 从标准语义上看,
A a = A()属于拷贝初始化流程:先创建临时对象A()(其ptr指向自身地址),再通过拷贝/移动构造函数将临时对象的内容复制到a中。如果严格按这个流程执行,a.ptr会继承临时对象的ptr值,也就是指向临时对象的地址,此时a.ptr != &a,且临时对象销毁后a.ptr会变成野指针。 - 你实验中观察到
a.ptr == &a,是因为编译器启用了返回值优化(RVO)/拷贝消除——C++标准允许编译器跳过临时对象的创建,直接在a的内存地址上构造对象。这种情况下,构造函数直接在&a的位置执行,ptr = this自然让a.ptr指向&a。
如何确保a.ptr必然指向自身?
如果需要a.ptr稳定指向&a,有两种可靠方案:
- 改用直接初始化:
A a;,直接在a的地址构造对象,避免临时对象的产生。 - 显式定义拷贝/移动构造函数,在其中重置
ptr:
class A { public: A* ptr; A() : ptr(this) {} // 拷贝构造 A(const A&) : ptr(this) {} // 移动构造 A(A&&) : ptr(this) {} };
内容的提问来源于stack exchange,提问作者Zhang Yuhan
相关产品推荐
相关产品推荐

