这是啥语法 - new (this) T(); [复制]

Posted

技术标签:

【中文标题】这是啥语法 - new (this) T(); [复制]【英文标题】: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 new。 this 不是左值,所以 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 好吧,我知道这不是一个坏主意的唯一原因。 【参考方案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);

【讨论】:

以上是关于这是啥语法 - new (this) T(); [复制]的主要内容,如果未能解决你的问题,请参考以下文章

php中的$this->$object =& new $class是啥意思[重复]

JavaScript中用new操作符创建对象的时候具体发生了啥过程

JL 在 at&t 语法中是啥意思?

“where T : class, new()”是啥意思?

使用 box 关键字和 Box::new 有啥区别?

javascript中new是啥意思