【发布时间】:2016-02-01 21:09:58
【问题描述】:
我一直在好奇地检查 STL 的实现,并在 experimental/optional 中找到了这段代码。代码如下:
optional&
operator=(const optional& __opt)
{
if (this->__engaged_ == __opt.__engaged_)
{
if (this->__engaged_)
this->__val_ = __opt.__val_;
}
else
{
if (this->__engaged_)
this->__val_.~value_type();
else
::new(_VSTD::addressof(this->__val_)) value_type(__opt.__val_);
this->__engaged_ = __opt.__engaged_;
}
return *this;
}
这是std::optional<T> 类的复制赋值运算符实现。我认为为了讨论的效果,弄清楚这些变量是什么也应该很重要,所以这里是类的存储:
typedef _Tp value_type;
union
{
char __null_state_;
value_type __val_;
};
bool __engaged_ = false;
第一个代码摘录以两种不同的方式显示了对 __val_ 的赋值,一种使用简单赋值 (this->__val_ = __opt.__val_),另一种使用放置新 (::new(_VSTD::addressof(this->__val_)) value_type(__opt.__val_);)。有什么不同?在这种情况下,为什么要使用一个或另一个?
【问题讨论】:
标签: c++ new-operator placement-new