C 20 中类模板构造函数可以有冗余模板参数列表吗?
在 C 17 中,允许声明类模板构造函数具有冗余的模板参数列表,如以下代码所示:
template<typename T> struct S { S<T>(); };
但是,随着 C 20 的出现和兼容性更改的实现,上述代码现在在 GCC 主干上引发错误(对于-std=c 20)。另一方面,Clang trunk 可以毫无问题地编译代码。这种不一致引出了一个问题:这是一个错误还是尚未在编译器中完全实现的有意破坏性更改?
答案
答案在于C 20 规格的细微变化。具体来说,修改了以下部分:
[class.ctor]
“构造函数由声明引入,该声明的声明符是以下形式的函数声明符:
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
其中 ptr 声明符仅由 id-表达式、可选的属性说明符-seq 和可选的括弧组成,并且 id-表达式具有以下形式之一:"
在类模板内的成员声明的情况下,id-表达式现在必须是直接封闭实体的注入类名。
因此,虽然 C 17 允许 S
因此,在使用 -std=c 20 的 GCC 主干上遇到的错误不是错误,而是破坏的迹象C 20 中引入的更改。尚未实现此更改的编译器将继续成功编译旧代码,而已实现此更改的编译器将遵守新的要求。
以上是C 20 类模板构造函数可以省略冗余模板参数列表吗?的详细内容。更多信息请关注PHP中文网其他相关文章!