首页 >后端开发 >C++ >C 20 类模板构造函数可以省略冗余模板参数列表吗?

C 20 类模板构造函数可以省略冗余模板参数列表吗?

Patricia Arquette
Patricia Arquette原创
2024-11-19 15:12:03399浏览

Can C  20 Class Template Constructors Omit Redundant Template Parameter Lists?

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 中的构造函数声明,C 20 需要 S()。此更改有效地消除了冗余并与 CWG 2237 保持一致,解决了潜在的容易出错的做法。

因此,在使用 -std=c 20 的 GCC 主干上遇到的错误不是错误,而是破坏的迹象C 20 中引入的更改。尚未实现此更改的编译器将继续成功编译旧代码,而已实现此更改的编译器将遵守新的要求。

以上是C 20 类模板构造函数可以省略冗余模板参数列表吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn