跳转至

in_place

https://zh.cppreference.com/w/cpp/utility/in_place https://stackoverflow.com/questions/49767940/why-do-stdoptional-constructors-use-stdin-place/49768728

是用来区分到底是用 optional<T> 的默认构造函数还是 T 的默认构造函数,参见 N3527,in_place_t 原本的名字是 emplace:

该提议提供了一个 'in_place' 构造函数能将 optional 的构造函数的参数完美转发给 T 的构造函数。为了触发这个构造函数我们应该使用标签结构 emplace。我们需要额外的标签来区分一些情况,比如是调用 optional 的默认构造函数还是要 T 的默认构造函数:

optional<Big> ob{emplace, "1"}; // 调用构造函数 Big{"1"} (不移动)
optional<Big> oc{emplace};      // 调用构造函数 Big{} (不移动)
optional<Big> od{};             // 创建一个 disengaged 的 optional

……另一方面,在很多容器类型中 emplace 在 std: 中被重载成既是成员函数也是标签,如果这个问题很严重,那么标签(emplace 作为标签的情况)可以被重命名为 in_place。