我一直在好奇地检查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_
)。有什么不同?在这种情况下,为什么要使用其中一种?
答案 0 :(得分:4)
默认情况下,未初始化可选内存中的存储。在第一种情况下,存储已经构建,因此它使用对象的复制赋值运算符。
在第二种情况下,它需要在分配的存储中构造一个对象,因为在该代码路径中,赋值的左侧从未构造过它的存储。
答案 1 :(得分:1)
这或多或少是这样做的唯一方法。当rhs(__opt
)没有参与时,需要破坏__val__
,如果它被使用,而我们的成员不参与,我们必须创建一个对象那里。
第一个if
处理这两个参数都是“参与”的情况。是否参与&#39;在这种情况下,不应该做任何事情,或者我们可以使用简单的任务。