c++ - C++ 中的非类型模板参数可以使用大括号初始值设定项吗?

标签 c++ templates language-lawyer list-initialization

在下一个程序中,第二个非类型模板参数 struct A初始化为{}在别名模板 B<T> 中:

template<class T, T>
struct A{};

template<class T>
using B = A<T, {}>;

B<int> b;

GCC 是唯一接受这一点的编译器。 Clang 和 MSVC 都拒绝了具有类似错误的程序。铿锵:

error: expected expression

MSVC:

error C2760: syntax error: '{' was unexpected here; expected 'expression'

演示:https://gcc.godbolt.org/z/6bc3sx451

这里是哪个编译器?

最佳答案

我认为 GCC 是错误的。

[temp.names]模板参数的语法表示模板参数必须是常量表达式类型 IDid-表达式

{} 既不是表达式,也不是类型,也不是(非)限定名称。

关于c++ - C++ 中的非类型模板参数可以使用大括号初始值设定项吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70729816/

相关文章:

c++ - 谷歌单元测试默认设置

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

c++ - 默认模板类参数混淆了 g++?

c - 关于在 printf 函数中使用时指向整数的未初始化指针的行为问题

c++ - 通过对其基类的引用移动对象后,对象的状态是什么?

c++ - 如何在 C++ 中将字符串传递给双引号

c++ - 编辑全局变量时减少重新编译

c++ - 将 QFile 转换为文件*

django - 如何在 django 应用程序中添加 Bootstrap 模板

c++ - 两个函数声明共享一个定义,这合法吗?