为什么 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
一些 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 requestingT
'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