这是啥语法 - 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是啥意思[重复]