Почему конструктор (4) существует для std::variant
из http://en.cppreference.com/w/cpp/utility/variant/variant? Похоже, что это вызовет большую двусмысленность в коде, которого в противном случае можно было бы избежать, будучи явным. Например, пример кода в cppreference подчеркивает возможную двусмысленность, которую пользователи могут не заметить (третья строка)
variant<string> v("abc"); // OK
variant<string, string> w("abc"); // ill-formed, can't select the alternative to convert to
variant<string, bool> w("abc"); // OK, but chooses bool
Есть ли какой-нибудь случай, когда это абсолютно необходимо?
Другой вопрос заключался в том, почему конструкторы (6) и (8) нужны на той же странице cppreference. Не будут ли (5) и (7) служить целям, для которых предназначены (6) и (8)? Возможно, я ошибаюсь в их использовании.
Для читателя конструкторы, о которых я упоминал в моем вопросе,
constexpr variant(); // (1) (since C++17)
variant(const variant& other); // (2) (since C++17)
variant(variant&& other); // (3) (since C++17)
template< class T > // (4) (since C++17)
constexpr variant(T&& t);
template< class T, class... Args >
constexpr explicit variant(std::in_place_type_t<T>, Args&&... args); // (5) (since C++17)
template< class T, class U, class... Args >
constexpr explicit variant(std::in_place_type_t<T>,
std::initializer_list<U> il, Args&&... args); // (6) (since C++17)
template< std::size_t I, class... Args >
constexpr explicit variant(std::in_place_index_t<I>, Args&&... args) // (7) (since C++17)
template <size_t I, class U, class... Args>
constexpr explicit variant(std::in_place_index_t<I>,
std::initializer_list<U> il, Args&&... args); // (8) (since C++17)