"this" 指针上的 const_cast 是未定义的行为吗?

Is const_cast on "this" pointer an undefined behavior?

我得到了以下c++代码。我可以在 Linux 机器上用 g++ 4.9.2 编译它。然后当我 运行 它时,它打印 10。似乎创建了一个新对象并将其分配给在默认构造函数中使用 const_cast 创建的指针。没有内存泄漏(我使用 valgrind 检查过)。这是某种未定义的行为还是合法的?

#include <iostream>

using namespace std;

class A
{
   public:
      A() : x(0)
      {
         A *tmp = const_cast<A*>(this);
         *tmp = A(10);
      }

      A(int x)
      {
         this->x = x;
      }

      int getX() const
      {
         return x;
      }

   private:
      int x;
};

int main()
{
   A a;

   cout << a.getX() << endl;

   return 0;
}

const_cast 与您遇到的行为无关。您的代码可能会简化为以下内容:

  A() : x(0)
  {
     *this = A(10);
  }

因此,如果我们想使用默认构造函数创建对象,则会发生以下情况:

  1. 在构造函数体之前对象this的内存被保留。
  2. x(0) 0 分配给 this 的成员 x
  3. A(10) class A 的新(未命名)对象是使用构造函数 A(int) 创建的。此新对象成员 x 的值为 10
  4. this= 这里未命名的对象被赋值(使用自动生成的复制赋值运算符,它是按字段的)到*this。因此,this 的成员 x 的值变为 10.
  5. 在那行之后临时未命名对象被销毁。
  6. 返回
  7. this

这是完全合法和预期的行为。