C++ 显然,不明确的调用不会导致GCC上的编译错误 P.>我感到惊讶的是,GCC做了不>强>考虑以下程序中对 FULL()/的调用:< /P> #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); } #包括 结构B1{bool foo(bool){return true;}}; 结构B2{bool foo(bool){return false;}}; 结构C:公共B1,公共B2 { 使用B1::foo; 使用B2::foo; }; int main() { C C; //在GCC 4.7.2和GCC 4.8.0(测试版)上编译并打印“true”; //未根据Clang 3.2和ICC 13.0.1进行编译; std::cout

C++ 显然,不明确的调用不会导致GCC上的编译错误 P.>我感到惊讶的是,GCC做了不>强>考虑以下程序中对 FULL()/的调用:< /P> #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); } #包括 结构B1{bool foo(bool){return true;}}; 结构B2{bool foo(bool){return false;}}; 结构C:公共B1,公共B2 { 使用B1::foo; 使用B2::foo; }; int main() { C C; //在GCC 4.7.2和GCC 4.8.0(测试版)上编译并打印“true”; //未根据Clang 3.2和ICC 13.0.1进行编译; std::cout,c++,c++11,language-lawyer,diagnostics,ambiguous-call,C++,C++11,Language Lawyer,Diagnostics,Ambiguous Call,正如您所说,在您的程序中对foo(true)的调用显然是不明确的;此外,根据§10.2中介绍的算法,它是不明确的,因此在使用时应该对其进行标记。(使用声明标记是不正确的;10.2(1)明确说明名称的不明确用法在查找时标记,而不是在声明时标记。) 将此程序与类似的程序进行对比是很有趣的,这是一个类似的程序的主题(从错误报告中稍作修改以使并行更清晰): #包括 结构A{ 静态int foo(){return 1;} 静态int foo(char){return 2;} }; 结构B1:A{ //使用

正如您所说,在您的程序中对
foo(true)
的调用显然是不明确的;此外,根据§10.2中介绍的算法,它是不明确的,因此在使用时应该对其进行标记。(使用
声明标记
是不正确的;10.2(1)明确说明名称的不明确用法在查找时标记,而不是在声明时标记。)

将此程序与类似的程序进行对比是很有趣的,这是一个类似的程序的主题(从错误报告中稍作修改以使并行更清晰):

#包括
结构A{
静态int foo(){return 1;}
静态int foo(char){return 2;}
};
结构B1:A{
//使用A::foo;
};
结构B2:A{
//使用A::foo;
};
结构C:B1、B2{
//使用B1::foo;
//使用B2::foo;
};
int main()
{
标准::cout§7.3.3/3:

在用作成员声明的USE声明中,嵌套名称说明符应命名所定义类的基类。如果此类USE声明命名构造函数,则嵌套名称说明符应命名所定义类的直接基类;否则,将引入由成员名称查找找到的声明集向上(10.2、3.4.3.1)

^14:

…[注意:两个using声明可能会引入具有相同名称和相同参数类型的函数。如果对于非限定函数名的调用,函数重载解析选择了此类using声明引入的函数,则函数调用的格式不正确

^16:

为了解决重载问题,由using声明引入到 派生类将被视为派生类的成员


因此,使用
声明的
是合法的,但正如您所说,这些函数是同一重载集中的对等函数,并且程序的格式不正确。

在VC11上构建失败。调用错误不明确。@MarkGarcia:是的,似乎只有GCC接受它。问题是这是由于一个错误还是这种错误不需要诊断。FWIW,g++4.4.3给出了一个错误,但不是在
main
中使用
foo
时,而是在
上已经在
C
中使用了
s:
ambig.cc:9:错误:使用声明“using B2::foo”与之前的using声明冲突
@us2012:这确实是我对任何编译器的期望,但有趣的是看到是同一个编译器的不同版本之间的行为发生了变化。@Andy是的,我觉得奇怪的是,当试图调用
foo
时,所有g++4.6、g++4.8、clang3.2、icc13都在第18行找到了错误,而不是在第9行找到了含糊不清的
using
声明。
#include <iostream>

struct A {
   static int foo() {return 1;}
   static int foo(char) { return 2;}
};

struct B1 : A {
//   using A::foo;
};
struct B2 : A {
//   using A::foo;
};

struct C : B1, B2 {
//   using B1::foo;
//   using B2::foo;
};

int main()
{
    std::cout << C::foo();
}