【问题标题】:what is this syntax - new (this) T(); [duplicate]这是什么语法 - new (this) T(); [复制]
【发布时间】:2014-07-28 07:45:01
【问题描述】:

我遇到了这样的 C++ 代码:

T& T::operator=(const T&t) 
{
   ...
   new (this) T(t);
   ...
}

这条线对我来说很陌生:new (this) T(t);

我可以看到它正在调用复制构造函数来填充“this”,但不知何故我无法理解语法。估计我已经习惯了this = new T(t);

你能帮帮我吗?

【问题讨论】:

  • Placement newthis 不是左值,所以 this = new T(t); 无法编译。
  • 不过,使用placement new in 进行复制是邪恶的。尤其是在继承方面真的很糟糕。当有虚拟基地时。
  • @chris IIRC this = new T(t);真的 用于放置新的旧语法。 -- 编辑:是的,直到 CFront 的 2.0 版,D&E pp. 91-92 -- 2.0 版于 1989 年发布,所以这个语法早于 25 年 o.O
  • 哦,没有意识到T 是类本身而不是模板参数。在那种情况下,@my_question,一定要看看复制交换成语。
  • @dyp 好吧,我知道这不是一个坏主意的唯一原因。

标签: c++


【解决方案1】:

就是所谓的新放置算子。它在括号中的表达式指定的地址构造一个对象。例如复制赋值操作符可以这样定义

const C& C::operator=( const C& other) {
   if ( this != &other ) {
      this->~C(); // lifetime of *this ends
      new (this) C(other); // new object of type C created
   }
   return *this;
}

在此示例中,首先使用析构函数的显式调用销毁当前对象,然后使用复制构造函数在该地址创建一个新对象。

也就是说,这个 new 运算符不会分配新的内存范围。它使用已经分配的内存。

此示例取自 C++ 标准。至于我,我不会返回 const 对象。将运算符声明为

会更正确
C& C::operator=( const C& other);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多