Немного std::optional
конструкторы использовать 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
Конструкторы на месте реализованы с помощью тега на месте, а не с помощью какой-то магии включения-включения (и без тега)?
Upd: Вопрос немного обновлен, чтобы подчеркнуть, что я понимаю, что простое отсутствие тега на месте не сработает.
Как сказал Прохожий в комментарий, цель состоит в том, чтобы устранить неоднозначность ситуации, когда нужно вызвать конструктор по умолчанию optional<T>
и ситуация, когда кто-то хочет вызвать конструктор по умолчанию T
,
Это намерение предлагается в N3527, где оригинальное предложенное имя in_place_t
является emplace
, Я цитирую соответствующую часть здесь:
Нам нужен дополнительный тег для устранения неоднозначности определенных ситуаций, таких как вызов
optional
конструктор по умолчанию и запрашивающийT
Конструкция по умолчанию: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
Других решений пока нет …