19

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

template< class... Args > 
explicit optional( std::in_place_t, Args&&... args );

我看到这样的构造函数可以在没有就地标签的情况下实现,并使用一些enable_if(SFINAE)魔法来不参与不情愿的重载,即:

template< class... Args > 
explicit optional( Args&&... args );

为什么std::optional's 的就地构造函数是用std::in_place_t标签而不是一些enable_if魔法(而且没有标签)实现的?

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

4

1 回答 1

18

正如 Passer By 在评论中所说,目的是消除人们想要调用默认构造函数的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
于 2018-04-11T07:13:31.437 回答