C++ 可以构造空std::optional<;T>;呼叫T';默认构造函数是什么?
存储在C++ 可以构造空std::optional<;T>;呼叫T';默认构造函数是什么?,c++,c++17,language-lawyer,std,c++20,C++,C++17,Language Lawyer,Std,C++20,存储在std::optional实例中的对象是否保证使用placementnew进行初始化?这是我对大多数实现的期望,但是,我也可以想象以下实现: /* pseudocode */ template<typename T> class optional { T object; bool has_value; }; /*伪代码*/ 模板类可选{ T对象; bool具有_值; }; 在这种情况下,当构造不包含值的std::optional时,必须调用T的默认构造函数。
std::optional
实例中的对象是否保证使用placementnew
进行初始化?这是我对大多数实现的期望,但是,我也可以想象以下实现:
/* pseudocode */
template<typename T> class optional {
T object;
bool has_value;
};
/*伪代码*/
模板类可选{
T对象;
bool具有_值;
};
在这种情况下,当构造不包含值的std::optional
时,必须调用T
的默认构造函数。是否保证不是这种情况,即使
T
有默认构造函数,也不会调用它
在与内存管理相关的cppreference中,我只能找到以下内容:“如果一个可选对象包含一个值,则该值保证作为可选对象示意图的一部分进行分配,即,不会发生动态内存分配。”()但是,我上面的“实现”也满足这一要求。标准要求由默认构造函数或其
std::nullopt_t
构造函数初始化的std::optional
构造函数不初始化其包含的t
对象
来自(我的):
constexpr optional()noexcept代码>
constexpr可选(nullopt_t)无例外代码>
后置条件:*此
不包含值。
备注:未初始化任何包含的值。对于每个对象类型T
这些构造函数都是constexpr构造函数([dcl.constexpr])
您链接的文档指出,T
的唯一要求是,因此我假设是这样。除非使用了新的布局,否则这是不可能的。它在任何时候都不是用新的构建的。默认情况下,它不会构造对象。实现通常只在类中保留额外的空间,以便将来可能进行构造。@ALX23z问题指定了新的位置,这也是这种初始化在后台的工作方式。否则,您将如何在您提到的类中保留的额外空间中构造对象?@super-oh。。。错过了“放置”部分。此外,我相信它可以通过union完成,而无需placement new。@ALX23z可能用于聚合,但如果在union中使用带有用户定义构造函数和析构函数的类,通常也需要使用placement new在活动成员之间切换。所以最终你不会得到多少。