Почему 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