别名模板和令人困惑的语法
Alias template and confusing syntax
>我从下面复制了块 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)
。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 部分定义/别名模板模板参数
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 如何在C++20中创建模板别名的推导指南
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 告诉c++编译器该参数没有别名
- 单独定义模板化嵌套类方法的正确语法
- 别名模板和令人困惑的语法
- 应用于类型别名声明的 [[maybe_unused]] 属性的语法
- 具有"using"语法的固定大小数组别名
- 模板别名上下文中的模板<>模板<>语法有什么用?
- Doxygen 对 C++11 模板别名的支持("using"语法)?
- 定义类型别名时出现语法错误
- 别名而不是糖语法的新变量
- 引用模板(别名?)的语法
- 用于声明具有别名的类层次结构的Cython语法