我对 GCC 这样做感到惊讶not考虑调用foo()
在下面的程序中存在歧义:
#include <iostream>
struct B1 { bool foo(bool) { return true; } };
struct B2 { bool foo(bool) { return false; } };
struct C : public B1, public B2
{
using B1::foo;
using B2::foo;
};
int main()
{
C c;
// Compiles and prints `true` on GCC 4.7.2 and GCC 4.8.0 (beta);
// does not compile on Clang 3.2 and ICC 13.0.1;
std::cout << std::boolalpha << c.foo(true);
}
上面的函数调用编译并返回true
在 GCC 4.7.2 和 GCC 4.8.0 (beta) 上,而它不会编译(正如我所期望的)在 Clang 3.2 和 ICC 13.0.1 上。
这是否属于“无需诊断”,还是 GCC 中的一个错误?鼓励引用 C++11 标准。
§7.3.3/3:
在用作成员声明的 using 声明中,嵌套名称说明符应命名所定义的类的基类。如果这样的 using 声明命名了构造函数,则嵌套名称说明符应命名所定义的类的直接基类;否则它引入了通过成员名称查找找到的声明集(10.2、3.4.3.1).
¶14:
… [ 注意:两个 using 声明可能会引入具有相同名称和相同参数类型的函数。如果对于非限定函数名的调用,函数重载决议选择由此类 using 声明引入的函数,则该函数调用是格式错误的。
¶16:
为了重载决策的目的,通过 using 声明引入的函数
派生类将被视为派生类的成员。
So, the using
声明是合法的,但正如您所说,这些函数是同一重载集中的对等体,并且该程序格式不正确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)