下面的代码
struct Foo{};
struct Bar{};
struct Base {
Foo func1(const Foo , const Bar = Bar{}) const {
return {};
};
};
struct Derived : public Base {
using Base::func1;
Foo func1(const Foo ) const {
return {};
};
};
int main() {
Foo foo;
Derived der;
der.func1(foo);
}
被ICX和clang拒绝,但被GCC接受(最高13.1)。https://godbolt.org/z/4M3rrs3r4
我认为GCC错了。如果这两个func1
是非成员,GCC将以不明确为由拒绝调用。
我说的对吗
2条答案
按热度按时间juzqafwq1#
这是编译器gcc的bug。
从C++ 20(9.9使用声明)
15 [* 注6*:为了在重载解析期间形成一组候选函数,由using-declaration引入到派生类中的函数被视为派生类的成员(11.8)。特别是,隐式对象参数被视为对派生类的引用,而不是对基类的引用(12.4.2)。这对函数的类型没有影响,并且在所有其他方面,函数仍然是基类的成员。- * 结束注解 *]
和(9.3.4.7默认参数)
1....当一个函数的声明通过using-declaration(9.9)引入时,任何与声明相关的默认参数信息也是已知的。
因此,对于重载解析,类
Derived
中的候选函数集由两个函数组成和
而这样的号召
在这种情况下是模糊的。可以调用任一函数。
pokxtpni2#
这是GCC 7中引入的一个bug:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82894