Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可以构造空std::optional<;T>;呼叫T';默认构造函数是什么?_C++_C++17_Language Lawyer_Std_C++20 - Fatal编程技术网

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
实例中的对象是否保证使用placement
new
进行初始化?这是我对大多数实现的期望,但是,我也可以想象以下实现:

/* 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在活动成员之间切换。所以最终你不会得到多少。