gpt4 book ai didi

c++ - 非模板函数尾随要求子句的编译器差异

转载 作者:行者123 更新时间:2023-12-04 02:28:10 25 4
gpt4 key购买 nike

考虑以下示例:

void f() requires true { }
int main() { f(); }

Clang(1) ( DEMO ) 接受这个程序,而 GCC(1) ( DEMO ) 拒绝它并出现以下错误:

error: constraints on a non-templated function

请注意,约束表达式实际上可以用于 Clang 的情况,因为以下程序被 Clang 拒绝:

void f() requires false { }
int main() { f(); } // // error: no matching function for call to 'f'

Clang 指出声明的 f 不是候选者,因为不满足约束(因为它是 f() 调用的候选者;DEMO ).

  • 这里哪个编译器是正确的,管理它的相关标准规则是什么?

(1) GCC HEAD 11.0.0 20210124 和 Clang HEAD 12.0.0 (20210124),-std=c++20

最佳答案

除非另有说明,否则以下所有标准引用均指 N4861 (March 2020 post-Prague working draft/C++20 DIS) .


这是一个 Clang 错误,GCC 拒绝该程序是正确的,根据 [dcl.decl]/4 (以及 [temp.constr.decl]/1 )[强调我的]:

The optional requires-clause in an init-declarator ormember-declarator shall be present only if the declarator declares a templated function ([dcl.fct]). When present after a declarator,the requires-clause is called the trailing requires-clause. [...]

同一段落还包含一个(非规范的)示例,明确指出 OP 的示例格式错误:

[ Example:

void f1(int a) requires true;       // error: non-templated function

template<typename T>
auto f2(T a) -> bool requires true; // OK

// ...

end example ]

我们可能会注意到,在(成为 C++20 的)工作草案的早期版本中,N4810 , [dcl.decl]/4 对允许出现要求子句的地方有较弱的要求:

The optional requires-clause (Clause 13) in an init-declarator or member-declarator shall not be present when the declarator does not declare a function (9.2.3.5). [...]

[ Example:

void f1(int a) requires true; // OK

// ...

end example ]

其中 OP 用例的非规范示例明确显示为格式良好。其初衷可以说是允许基于类模板的模板参数来约束类模板的非模板成员函数:

#include <iostream>

template<bool B>
struct S {
void f() requires B { std::cout << "true\n"; }
void f() requires (!B) { std::cout << "false\n"; }
};

int main() {
S<true>{}.f(); // true
S<false>{}.f(); // false
}

N4861 中 [dcl.decl]/4 的最终状态(针对 C++20)仍然允许这样做,其中限制是模板化函数(参见 < em>templated entity in [temp.pre]/8 ,特别是[temp.pre]/8.3 ),它不仅包括函数模板(以及非模板和模板类模板的函数模板成员),还包括类的非模板成员函数模板。


Clang 错误报告:

关于c++ - 非模板函数尾随要求子句的编译器差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65882929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com