【发布时间】:2021-12-31 12:19:30
【问题描述】:
不能重载具有相同参数类型的静态和非静态成员函数。但是,如果成员函数是模板并且其中一个具有 requires 子句,那么所有编译器都允许它。但是当调用 both 的成员函数时会出现问题:
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)
}
如果main() 中只剩下一个(任何)行,则 GCC 和 Clang 接受该程序。但是当main() 中的两行都存在时,Clang 会打印
error: definition with same mangled name '_ZN1A1fIiEEiT_' as another definition
并且 GCC 报告内部编译器错误。演示:https://gcc.godbolt.org/z/4c1z7fWvx
是否所有编译器都错误地接受具有重载静态和非静态成员函数的struct A 定义?或者他们只是在调用这两个函数时有类似的错误。
【问题讨论】:
-
这基本上是 stackoverflow.com/questions/70429541/… 的副本,除非我遗漏了什么。
-
感谢您的参考。在那个问题中,答案是 Clang 是正确的,而 GCC 不是,而这里两者都表现出相同的行为。
标签: c++ static language-lawyer overloading