别名模板和令人困惑的语法

Alias template and confusing syntax

本文关键字:语法 别名      更新时间:2023-10-16

>我从下面复制了块 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>

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,该重载将被丢弃。

为什么参数列表中没有定义名称类型?

省略号可能位于模板和/或参数列表中。前者称为可变参数模板,后者称为可变参数函数。那么有什么区别呢?

可变参数模板允许您将任意数量的类型传递给函数,而可变参数函数允许您将任意数量的参数传递到函数中。如果您希望函数接受任意数量的类型和参数,则可以同时使用它们。

为什么调用 f(( 而不是声明?

f()是一个函数声明。我想它确实看起来令人困惑。把它想象成f(void)