W.F*_*.F. 40 c++ templates language-lawyer c++17
我发现gcc和clang允许decltype(auto)在非类型模板参数类型子句中使用.例如:
template <decltype(auto)>
struct X {};
int foo ;
int main() {
X<(foo)> x;
static_cast<void>(x);
}
Run Code Online (Sandbox Code Playgroud)
它是标准兼容功能还是一些gnu扩展?
Sto*_*ica 29
这是标准的.首先,对于非类型模板参数:
非类型模板参数应具有以下之一(可选的cv限定)类型:
- ...
- 包含占位符类型的类型.
占位符类型具有以下指定的位置:
auto和decltype(auto)类型说明符用于指定占位符类型,稍后将通过从初始值设定项中进行推导来替换该占位符类型.auto类型说明符还用于引入具有尾随返回类型的函数类型或表示lambda是通用lambda([expr.prim.lambda.closure]).auto类型说明符还用于引入结构化绑定声明.
占位符类型也可以在new-expression的new-type-id或type-id中的type-specifier-seq中使用,也可以在模板中作为参数声明的decl-specifier-seq的decl-specifier使用 -参数.
由于上面的子弹说"占位符类型",并且这种类型可以用auto或指定decltype(auto),两个编译器都是正确的.