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

ber*_*cik 2 c++ this const-cast 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;
}
Run Code Online (Sandbox Code Playgroud)

ale*_*in0 5

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

  A() : x(0)
  {
     *this = A(10);
  }
Run Code Online (Sandbox Code Playgroud)

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

  1. this保留构造函数主体对象的内存之前
  2. X(0) 0被分配给成员xthis
  3. A(10)A使用构造函数创建类的新(未命名)对象A(int)。这个新的对象成员x具有价值10
  4. this =这里,未命名的对象被分配(使用自动生成的副本分配操作符,在字段范围内)*this。因此,的成员x的价值this成为10
  5. 在该行之后临时的未命名对象被破坏。
  6. this 返回。

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