C 20 中的类模板构造函数中的冗余模板参数列表
具有冗余模板参数列表的类模板构造函数的有效性一直存在争议C 20 的介绍。这是问题及其解决方案:
在 C 中17 中,下面的代码被认为是格式良好的:
template<typename T> struct S { S<T>(); };
但是,在 C 20 中,相同的代码在 -std=c 20 下的某些编译器(例如 gcc trunk)中触发错误:
error: expected unqualified-id before ')' token 3 | S<T>(); ^
C 的变化20
C 20 标准要求更改类模板构造函数声明的语法。标准兼容性部分中的以下增量强调了这一点:
[diff.cpp17.class] ... Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor. Rationale: Remove potentially error-prone option for redundancy. ...
本质上,不再允许在以前的代码中使用“冗余”模板参数列表 S
template<typename T> struct S { S(); // CORRECT C++20 syntax };
基本原理
此更改的基本原理是通过禁止使用简单的模板 ID。通过强制显式使用注入的类名,编译器可以更准确地解析预期的构造函数。
结论
C 20 中的此更改不构成错误,而是有意进行的重大更改,以增强类模板构造函数声明的清晰度和正确性。虽然这可能会导致依赖先前语法的现有代码出现兼容性问题,但它最终提高了 C 应用程序的整体安全性和可靠性。
以上是C 20 类模板构造函数中是否允许冗余模板参数列表?的详细内容。更多信息请关注PHP中文网其他相关文章!