You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:12:39