Почему std :: optional конструкторы используют std :: in_place?
Некоторые std::optional
конструкторы используют std::in_place_t
параметр тега, как это:
template< class... Args >
explicit optional( std::in_place_t, Args&&... args );
Я вижу, что такие конструкторы могут быть реализованы без тега in-place и использовать некоторую магию enable-if, чтобы не участвовать в нежелательных перегрузках, а именно:
template< class... Args >
explicit optional( Args&&... args );
Почему std::optional
встроенные конструкторы реализованы с использованием тега in-place, а не с помощью магии enable-if (и без тега)?
Обновление: вопрос немного обновлен, чтобы подчеркнуть, что я понимаю, что просто исключить тег in-place не получится.
Ответы
Ответ 1
Как сказал прохожий в комментарии, цель состоит в том, чтобы устранить ситуацию, когда требуется вызвать конструктор по умолчанию 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