当前位置: 首页 > 知识库问答 >
问题:

c 17中的非类型模板参数可以解密(自动)吗?

江英华
2023-03-14

我发现gcc和clang允许在非类型模板参数类型子句中使用dectype(自动)。例如:

template <decltype(auto)>
struct X {};

int foo ;

int main() {
    X<(foo)> x;
    static_cast<void>(x);
}

[live demo gcc][live demo clang]

它是符合标准的功能还是一些gnu扩展?

共有1个答案

岳允晨
2023-03-14

这是标准的。首先,对于非类型模板参数:

[temp.param/4]

非类型模板参数应具有以下类型之一(可选cv合格):

  • ...
  • 包含占位符类型的类型。

其中占位符类型指定了以下内容:

[dcl.spec.auto/1]

自动类型和自动类型说明符用于指定占位符类型,该占位符类型稍后将通过初始化器的推导来替换。自动类型说明符还用于引入具有尾随返回类型的函数类型,或表示lambda是泛型lambda([expr.prim.lambda.closure])。自动类型说明符还用于引入结构化绑定声明。

[dcl.spec.auto/5]

占位符类型也可以在新类型id或新表达式的类型id的类型说明符seq中使用,也可以在模板参数中用作参数声明的decl说明符seq的decl说明符。

由于上面的项目符号表示“占位符类型”,并且这种类型可以用autodecltype(auto)指定,因此这两种编译器都是正确的。

 类似资料:
  • OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以RAII的方式处理它们。函数对类似于和。但是,也有一些函数对适用于资源数组,例如和。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。然而,我注意到有时我只使用一个缓冲区或纹理,在那里我不必承担向量的费用,我想如果发布函数在开始时采用大小参数,我会专门化类析构函数,但是... 对于上述SSCCE g树

  • 我试图从一组可变的模板类(其中每个类都有一个非类型参数)中恢复非typename模板参数,以便在另一种类型中将它们用作整数序列。 下面的代码显示了我所拥有的。整数序列/成员序列是从元组中抄袭出来的。 和的类型是

  • 另一个有用的可能示例:(伪代码)

  • 我正在学习C 17非类型模板参数的新功能。我编写了一个简单的代码片段,如下所示: 据我所知,福 但是,语句使用clang、MSVC 19.27编译,但在GCC 10.2、MSVC 19.25编译时失败。 我的问题是:为什么编译器的行为不同?标准对此有何规定? 链接到编译器资源管理器: 叮当声https://godbolt.org/z/66M695 海湾合作委员会https://godbolt.or

  • 也许我累了,但是我被这个简单的局部特化卡住了,它不起作用,因为指定模板参数: 将替换为,或没有帮助。那么这种专门化是否可能呢?

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。