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

Why do std::optional constructors use std::in_place?

一些 std::optional constructors use an 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 的就地构造函数是用 std::in_place_t 标签而不是一些 enable_if 魔术(没有标签)实现的?

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

正如路人在中所说的那样,目的是为了消除想要调用optional<T>的默认构造函数的情况和想要调用optional<T>的默认构造函数的情况的歧义。 T

此意向是在N3527中提出的,其中in_place_t的原提议名称是emplace。我在这里引用相关部分:

We need the extra tag to disambiguate certain situations, like calling optional's default constructor and requesting T's default construction:

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