我从https://en.cppreference.com/w/cpp/language/type_alias
的下面复制了代码块template<typename...>
using void_t = void;
template<typename T>
void_t<typename T::foo> f();
f<int>(); // error, int does not have a nested type foo
我不了解其中的某些方面,例如我们:
template<typename...>
为什么在参数列表中未定义名称类型?
和
void_t<typename T::foo> f();
为什么调用f()而不是声明?
这部分是什么意思? void_t<typename T::foo>
答案 0 :(得分:1)
template<typename...>
using void_t = void;
是模板别名,typename...
表示任意数量的类型。
结果类型为void
。
template<typename T> void_t<typename T::foo> f();
是一个函数声明。
返回类型为void_t<typename T::foo>
,所以void
但是
如果T::foo
不是有效的类型,则感谢SFINAE,该重载将被丢弃。
答案 1 :(得分:0)
为什么名称类型没有在参数列表中定义?
省略号可以在模板和/或参数列表中。前者称为 variadic模板,后者称为 variadic函数。那有什么区别?
可变参数模板允许您将任意数量的类型传递给函数,而可变参数函数允许您将任意数量的自变量传递给函数。如果您希望函数采用任意数量的和参数类型,则可以同时使用它们。
为什么调用f()而不是声明?
f()
是函数声明。我想它确实看起来令人困惑。可以将其视为f(void)
。