Почему конструкторы std :: option используют std :: in_place?

Немного 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: Вопрос немного обновлен, чтобы подчеркнуть, что я понимаю, что простое отсутствие тега на месте не сработает.

13

Решение

Как сказал Прохожий в комментарий, цель состоит в том, чтобы устранить неоднозначность ситуации, когда нужно вызвать конструктор по умолчанию 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
15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]