为什么std :: get <t>对于`variant`来说是一个全局函数?

时间:2017-02-05 20:49:42

标签: c++ templates variadic-templates c++17

有谁可以告诉我为什么C ++ 17的std::get<T>是全局函数而不是variant<...>的成员函数?

1 个答案:

答案 0 :(得分:7)

如果get<T>()是成员函数模板,则在依赖上下文中调用它时,需要template关键字。例如:

template <typename Variant>
void f(Variant const& v) {
    auto x0 = v.template get<T>(); // if it were a member
    auto x1 = get<T>(v);           // using a non-member function
}

即使没有using声明或指令get(),如果找到,std::variant<...>get()都在名称空间std中声明。因此,似乎没有充分的理由使其成为一个成员函数,因为全局函数更容易使用。