std :: variant转换构造函数行为

Bul*_*net 3 c++ c++17

C++ 17 std::variant<class... Types>有一个转换构造函数

template< class T >
constexpr variant(T&& t) noexcept(/* see below */);
Run Code Online (Sandbox Code Playgroud)

(http://en.cppreference.com/w/cpp/utility/variant/variant中的第4号).它的描述是一个相当难以理解的文本墙.这是否意味着表现为变体有一堆

template< class T_i > constexpr variant(T_i&& t) noexcept;
Run Code Online (Sandbox Code Playgroud)

构造函数,类型中每个T_i一个?

Vit*_*meo 5

让我们打破下面的描述:

构造一个变量,该变量持有替代类型,如果同时存在范围内的每个from 的虚函数重载,则该变量将由表达式的重载决策选择.TjF(std::forward<T>(t))F(Ti)TiTypes...

假设我们在文档中有示例:

variant<string, bool> x("abc"); // OK, but chooses bool
Run Code Online (Sandbox Code Playgroud)
  • Types...<string, bool>

如果每个来自虚构函数的重载F(Ti)TiTypes...

int F(string) { return 0; }
int F(bool)   { return 1; }
Run Code Online (Sandbox Code Playgroud)

由表达式的重载分辨率选择 F(std::forward<T>(t))

template <typename T>
void select(T&& t)
{
    std::cout << F(std::forward<T>(t)) << '\n';
}

int main()
{
    select("abc"); // prints `1`
}
Run Code Online (Sandbox Code Playgroud)

wandbox上的实例


构造一个持有替代类型的变体[...]Tj

所选择的替代类型因此.Tjbool