【发布时间】:2023-03-04 20:15:01
【问题描述】:
以下内容在 GCC 9.1 上无法编译(支持类非类型模板参数)
struct S { int i; };
template<S s>
struct T {};
int main()
{
T<{0}> x{};
}
尽管模板参数s 是具体类型S,但编译器仍报告error: could not convert '{0}' from '<brace-enclosed initializer list>' to 'S'。
T<S{0}> x{};
按预期工作,但 C++2a 是否允许省略具体类型名称 S,就像该语言的其他部分一样?
【问题讨论】:
-
添加一个将 int 转换为 S 的隐式构造函数怎么样? ` constexpr S(int in) :i(in){}`
-
@Hui 这确实允许编译这个简单的示例,但我认为它不会与指定的初始化程序很好地交互,例如。话虽如此,在这种情况下,GCC 9.1 似乎确实允许指定的初始化程序,但是我认为它使用的是初始化程序列表,而不是做你期望的事情。也就是说,T 可以编译,但在将 .i 更改为任意标识符(例如 T)时也会编译。这是 GCC 错误吗?