const_cast对“this”指针有不确定的行为吗?

时间:2017-03-14 15:39:32

标签: c++ this undefined-behavior const-cast

我有以下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;
}

1 个答案:

答案 0 :(得分:4)

Users 0..1 - 0..* Logins与您遇到的行为无关。您的代码可能会简化为以下内容:

const_cast

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

    构造函数体之前的
  1. 保留对象 A() : x(0) { *this = A(10); } 的内存。
  2. x(0) this已分配给0的成员x
  3. A(10)使用构造函数this创建类A的新(未命名)对象。此新对象成员A(int)的值为x
  4. this = 此处将未命名对象(使用自动生成的复制赋值运算符,即字段方式)分配给10。因此,*this的成员x的值为this
  5. 在该行之后临时未命名对象被销毁。
  6. 10已退回。
  7. 这是完全合法和预期的行为。