在STL实现中放置新的vs赋值

时间:2016-02-01 21:09:59

标签: c++ new-operator placement-new

我一直在好奇地检查STL的实现,并在String PackgeNameApp = "com.test.icon"; String name="NULL"; try { ApplicationInfo app = this.getPackageManager().getApplicationInfo(PackgeNameApp, 0); Drawable icon = getPackageManager().getApplicationIcon(app); name = getPackageManager().getApplicationLabel(app).toString(); } catch (PackageManager.NameNotFoundException e) { // } 中找到了这段代码。这是代码:

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; } 类的复制赋值运算符实现。我相信,对于这个讨论的效果,明确这些变量是什么也很重要,所以这里是classe的存储:

std::optional<T>

第一个代码摘录以两种不同的方式显示typedef _Tp value_type; union { char __null_state_; value_type __val_; }; bool __engaged_ = false; 的分配,一种使用简单的分配(__val_),另一种使用新的展示位置this->__val_ = __opt.__val_)。有什么不同?在这种情况下,为什么要使用其中一种?

2 个答案:

答案 0 :(得分:4)

默认情况下,未初始化可选内存中的存储。在第一种情况下,存储已经构建,因此它使用对象的复制赋值运算符。

在第二种情况下,它需要在分配的存储中构造一个对象,因为在该代码路径中,赋值的左侧从未构造过它的存储。

答案 1 :(得分:1)

这或多或少是这样做的唯一方法。当rhs(__opt)没有参与时,需要破坏__val__,如果它被使用,而我们的成员不参与,我们必须创建一个对象那里。

第一个if处理这两个参数都是“参与”的情况。是否参与&#39;在这种情况下,不应该做任何事情,或者我们可以使用简单的任务。