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

时间:2018-04-11 06:26:02

标签: c++ c++17 stdoptional

有些std::optional constructors使用std::in_place_t代码参数,如下所示:

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

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

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

为什么std::optional的就地构造函数是使用就地标记实现的,而不是使用一些enable-if magic(并且没有标记)?

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

1 个答案:

答案 0 :(得分:15)

正如Passer在comment中所说,目的是消除人们想要调用optional<T>的默认构造函数以及想要调用{{的默认构造函数的情况的情况的歧义。 1}}。

此意图是在N3527中提出的,原始提议的T名称为in_place_t。我在这里引用相关部分:

  

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

T