为什么构造函数(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
有些情况下绝对需要吗?
另一个问题是为什么需要从同一个cppreference页面构造函数(6)和(8)。 (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)