为什么std :: get <T> for"variant"是一个全局函数?

Bon*_*ero 9 c++ templates variadic-templates c++17

任何人都可以告诉我为什么std::get<T>C++ 17是一个全局函数而不是一个成员函数variant<...>

Die*_*ühl 8

如果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
}
Run Code Online (Sandbox Code Playgroud)

即使没有using声明或指令,get()如果同时发现它们std::variant<...>get()在命名空间中声明std.因此,似乎没有充分的理由使其成为成员函数,因为全局函数更容易使用.

  • 那么为什么 `emplace()` 是一个成员呢?这似乎不需要“template”关键字:https://en.cppreference.com/w/cpp/utility/variant/emplace (2认同)
  • @ShdNx:问题在于使用显式指定的模板参数解析成员函数模板:虽然 `get&lt;T&gt;(v)` 本质上要求指定 `T`,但 `v.emplace(a...)` 推导了它的所有内容模板参数。因此,那里不存在问题。 (2认同)
  • @DietmarKühl:实际上,您需要为“emplace”显式指定“T”,否则它不知道要尝试根据给定的参数构造什么。请参阅我之前指向 cppreference.com 的链接以获取示例。 (2认同)