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