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_t是emplace.我在这里引用相关部分:
我们需要额外的标记来消除某些情况的歧义,例如调用
optional默认构造函数和请求T默认构造:Run Code Online (Sandbox Code Playgroud)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