C++ 为什么std::可选构造函数使用std::in_place?

C++ 为什么std::可选构造函数使用std::in_place?,c++,c++17,stdoptional,C++,C++17,Stdoptional,某些构造函数使用如下标记参数: template< class... Args > explicit optional( std::in_place_t, Args&&... args ); 为什么std::optional的就地构造函数是用std::in\u place\t标记实现的,而不是用一些enable\u ifmagic(并且没有标记)实现的 更新:问题稍微更新了一下,以强调我意识到简单地忽略就地标记是不可行的。正如路人在,其目的是消除以下两种情况的歧义

某些构造函数使用如下标记参数:

template< class... Args > 
explicit optional( std::in_place_t, Args&&... args );
为什么
std::optional
的就地构造函数是用
std::in\u place\t
标记实现的,而不是用一些
enable\u if
magic(并且没有标记)实现的

更新:问题稍微更新了一下,以强调我意识到简单地忽略就地标记是不可行的。

正如路人在,其目的是消除以下两种情况的歧义:一种是要调用
optional
的默认构造函数,另一种是要调用
T
的默认构造函数

这一意图是在中提出的,其中,
原地
的原始拟定名称为
emplace
。我在此引述有关部分:

我们需要额外的标记来消除某些情况下的歧义,例如调用
optional
的默认构造函数和请求
T
的默认构造:

optional<Big> ob{emplace, "1"}; // calls Big{"1"} in place (no moving)
optional<Big> oc{emplace};      // calls Big{} in place (no moving)
optional<Big> od{};             // creates a disengaged optional
可选ob{emplace,“1”};//在适当位置调用大{“1”}(不移动)
可选oc{emplace};//调用大{}到位(不移动)
可选od{};//创建一个空闲的可选

这与任何内容都匹配。@cheers-sandhth.-Alf这是个问题吗?假设
T
有一个隐式转换构造函数,它使用一个类型不等于
T
的参数。然后,您将创建一个临时值,而不是将该值用于就地构造,而不可能更改此值。@MatthäusBrandl,但您可以尝试防止这种情况发生。事实上,不管有没有标记,一个单独的参数只是被转发。据我所知,没有创建临时版本。假设的无标记版本失败的唯一情况是默认构造包含的值。如何搜索论文/提案?@0x499602D2我用关键字“C++in_place_t paper”搜索,找到N3793,然后找到N3527。@0x499602D2如果您有权访问CppLang Slack,你可以发送消息给npaperbot。真是太棒了!
optional<Big> ob{emplace, "1"}; // calls Big{"1"} in place (no moving)
optional<Big> oc{emplace};      // calls Big{} in place (no moving)
optional<Big> od{};             // creates a disengaged optional