为什么std :: optional构造函数使用std :: in_place?

oli*_*ora 13 c++ c++17 stdoptional

一些std::optional 构造函数使用这样的std::in_place_t标记参数:

template< class... Args > 
explicit optional( std::in_place_t, Args&&... args );
Run Code Online (Sandbox Code Playgroud)

我看到这样的构造函数可以在没有就地标记的情况下实现,并使用一些enable-if魔法不参与不愿意的重载,即简单地说:

template< class... Args > 
explicit optional( Args&&... args );
Run Code Online (Sandbox Code Playgroud)

为什么std::optional使用就地标记实现就地构造函数而不是一些启用魔法(并且没有标记)?

更新:问题略有更新,以强调我意识到简单地省略就地标记是行不通的.

xsk*_*xzr 15

正如Passer在评论中所说,目的是消除人们想要调用默认构造函数optional<T>的情况以及想要调用默认构造函数的情况T.

这个意图是在N3527中提出的,其原始提议的名称in_place_templace.我在这里引用相关部分:

我们需要额外的标记来消除某些情况的歧义,例如调用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
Run Code Online (Sandbox Code Playgroud)

  • @ 0x499602D2我搜索了关键字"C++ in_place_t paper",找到N3793,然后找到N3527. (3认同)
  • 您如何搜索论文/提案? (2认同)
  • @0x499602D2 如果您可以访问 CppLang Slack,则可以向 npaperbot 发送消息。真是太棒了! (2认同)