На момент написания статьи cppreference дает достаточно простое определение семейства std::in_place_t
:
struct in_place_t {
explicit in_place_t() = default;
};
inline constexpr std::in_place_t in_place{};
template <class T>
struct in_place_type_t {
explicit in_place_type_t() = default;
};
template <class T>
inline constexpr std::in_place_type_t<T> in_place_type{};
template <size_t I> struct in_place_index_t {
explicit in_place_index_t() = default;
};
template <size_t I>
inline constexpr in_place_index_t<I> in_place_index{};
Однако последний проект стандарта С++ 17 связанный с isocpp.org, имеет более сложное определение (раздел 20.2.7, с. 536):
struct in_place_tag {
in_place_tag() = delete;
};
using in_place_t = in_place_tag(&)(unspecified );
template <class T>
using in_place_type_t = in_place_tag(&)(unspecified <T>);
template <size_t I>
using in_place_index_t = in_place_tag(&)(unspecified <I>);
in_place_tag in_place(unspecified );
template <class T>
in_place_tag in_place(unspecified <T>);
template <size_t I>
in_place_tag in_place(unspecified <I>);
Первая версия проста и понятна, но вторая версия довольно непрозрачна для меня. Итак, вопросы:
-
Какая версия верна, после Issaqua (ноябрь 2016 года)? (Предположительно второй, но возможно, что N4606 еще не обновлен после последней встречи и cppreference имеет.)
-
Очевидно, это изменилось в определенный момент времени; кто-нибудь имеет ссылку на бумагу, в которой упоминается об изменении?
-
Самое главное, может ли кто-нибудь объяснить, как должна работать вторая версия? Как выглядит примерная реализация?