C++ 中具有相同参数类型和 require 子句的静态和非静态成员函数模板

Fed*_*dor 17 c++ static overloading language-lawyer c++20

参数类型相同的静态和非静态成员函数不能重载。但是,如果成员函数是模板并且其中之一有requires子句,那么所有编译器都允许它。但是当调用这两个成员函数时就会出现问题:

struct A {
    static int f(auto) { return 1; }
    int f(auto) requires true { return 2; }
};

int main() {
    [[maybe_unused]] int (A::*y)(int) = &A::f; // ok everywhere (if no below line)
    [[maybe_unused]] int (*x)(int) = &A::f; //ok in GCC and Clang (if no above line)
}
Run Code Online (Sandbox Code Playgroud)

如果只剩下一行(任意),main()则 GCC 和 Clang 接受该程序。但是当两行都main()存在时,Clang 会打印

error: definition with same mangled name '_ZN1A1fIiEEiT_' as another definition
Run Code Online (Sandbox Code Playgroud)

GCC 报告内部编译器错误。演示: https: //gcc.godbolt.org/z/4c1z7fWvx

所有编译器在接受struct A重载静态和非静态成员函数的定义时都是错误的吗?或者他们只是在调用这两个函数时存在类似的错误。

Sha*_*our 1

这是根据[over.over]p4 的有效代码,其中表示:

非成员函数、静态成员函数和显式对象成员函数与函数指针类型或函数类型引用的目标匹配。隐式对象成员函数与指向成员函数类型的指针匹配。

clang 和 gcc 产生的错误是 mangling bugs,请参阅clang bug: functionsignatureconstraints are notapartofmangledname,该错误刚刚修复,并且gccbug:functionsignatureconstraintsarenotapartofmangledname