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

时间:2018-03-05 11:43:23

标签: c++ c++17

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

template< class T >
constexpr variant(T&& t) noexcept(/* see below */);

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

template< class T_i > constexpr variant(T_i&& t) noexcept;

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

1 个答案:

答案 0 :(得分:5)

让我们打破说明:

  

如果每个Tj都存在虚函数F(std::forward<T>(t))的重载,则构造一个包含替代类型F(Ti)的变体,该变量将由表达式Ti的重载决策选择来自Types...同时在范围内。

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

variant<string, bool> x("abc"); // OK, but chooses bool
  • Types...<string, bool>
  

如果来自F(Ti)

的每个Ti的虚函数Types...过载
int F(string) { return 0; }
int F(bool)   { return 1; }
  

由表达式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`
}

live example on wandbox

  

构造一个包含替代类型Tj [...]

的变体

因此,所选的替代类型Tjbool