我发现gcc和clang允许在非类型模板参数类型子句中使用decltype(auto)
。 E.g:
template <decltype(auto)>
struct X {};
int foo ;
int main() {
X<(foo)> x;
static_cast<void>(x);
}
[live demo gcc] [live demo clang]
是标准兼容功能还是某种gnu扩展?
答案 0 :(得分:28)
这是标准的。首先,对于非类型模板参数:
非类型模板参数应具有以下之一 (可选择cv-qualified)类型:
- ...
- 包含占位符类型的类型。
占位符类型具有以下指定的位置:
auto和decltype(auto)类型说明符用于指定a 占位符类型稍后将通过从中扣除来替换 初始化。 auto类型说明符也用于引入a 具有尾随返回类型的函数类型或表示a lambda是一个通用的lambda([expr.prim.lambda.closure])。汽车 type-specifier还用于引入结构化绑定 声明。
也可以在类型说明符-seq中使用占位符类型 新表达式的new-type-id或type-id,以及作为decl-specifier a中的参数声明的decl-specifier-seq 模板参数。强>
由于上面的子弹显示“占位符类型”,并且可以使用auto
或decltype(auto)
指定此类型,因此两个编译器都是正确的。