class 模板的构造函数声明不为 C++20 编译,但为 C++17 编译
class template's constructor declaration doesn't compile for C++20 but compiles for C++17
我正在学习 C++ 中的模板。特别是,我看到 here 我们可以为构造函数声明以下内容:
template<typename T>
struct Rational
{
Rational<T>();
};
但上面的代码片段 fails to compile in C++2a and compiles successfully 适用于 C++17。
这是一个编译器错误还是它不能为 C++2a 和 C++2b 编译的原因。如果有原因那么它是什么。我想知道 编译 以下示例中的标准 allow/prevent 中的哪些子句(如果有)。因为我已经用 C++17 和 C++20 测试了上面的例子,所以我只从这两个标准版本中寻找引用。
Is this a compiler bug or there is a reason why it doesn't compile for
C++2a and C++2b.
是的,这是自 2020 年以来就存在的 GCC 诊断 错误,请参阅PR 97202。
引自 Marek Polacek,一位 GCC 贡献者
This is C++20 DR 2237, disallow simple-template-id in cdtor: see
[diff.cpp17.class] p2. Just the diagnostic we give is horrible ;(.
也就是说,这是 DR2237 实施的预期行为,只是诊断有点糟糕。
这不是错误。
这是标准中change的结果。
Affected subclauses: [class.ctor] and [class.dtor]
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.
Effect on original feature: Valid C++ 2017 code may fail to compile in this revision of C++. For example:
template<class T>
struct A {
A<T>(); // error: simple-template-id not allowed for constructor
A(int); // OK, injected-class-name used
~A<T>(); // error: simple-template-id not allowed for destructor
};
但是有一个 bug report,它最初是关闭的,然后为了改进诊断消息而重新打开。
我正在学习 C++ 中的模板。特别是,我看到 here 我们可以为构造函数声明以下内容:
template<typename T>
struct Rational
{
Rational<T>();
};
但上面的代码片段 fails to compile in C++2a and compiles successfully 适用于 C++17。
这是一个编译器错误还是它不能为 C++2a 和 C++2b 编译的原因。如果有原因那么它是什么。我想知道 编译 以下示例中的标准 allow/prevent 中的哪些子句(如果有)。因为我已经用 C++17 和 C++20 测试了上面的例子,所以我只从这两个标准版本中寻找引用。
Is this a compiler bug or there is a reason why it doesn't compile for C++2a and C++2b.
是的,这是自 2020 年以来就存在的 GCC 诊断 错误,请参阅PR 97202。
引自 Marek Polacek,一位 GCC 贡献者
This is C++20 DR 2237, disallow simple-template-id in cdtor: see [diff.cpp17.class] p2. Just the diagnostic we give is horrible ;(.
也就是说,这是 DR2237 实施的预期行为,只是诊断有点糟糕。
这不是错误。
这是标准中change的结果。
Affected subclauses: [class.ctor] and [class.dtor] 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. Effect on original feature: Valid C++ 2017 code may fail to compile in this revision of C++. For example:
template<class T>
struct A {
A<T>(); // error: simple-template-id not allowed for constructor
A(int); // OK, injected-class-name used
~A<T>(); // error: simple-template-id not allowed for destructor
};
但是有一个 bug report,它最初是关闭的,然后为了改进诊断消息而重新打开。