在下面的C ++代码中,首先为单个foobar
参数定义double
,然后再为Foo
类型的单个参数定义one
。两者都在全局命名空间中定义。
在foobar
命名空间内,定义了Bar
的进一步重载,其中包含foobar
类型的单个参数。在此foobar
版本中,对double
foobar
参数(42.0)的无限制调用将失败。对double
的类似调用,这次使用(::)作用域解析运算符限定,也使用foobar
参数,但是会成功。
另一方面,对Foo
的无条件调用(参数类型为foobar
)成功。使用范围解析运算符限定的Foo
参数调用struct Foo {};
struct Bar {};
double foobar(double x) { return x; }
Foo foobar(Foo f) { return f; }
namespace one {
Bar foobar(Bar b) {
//foobar(42.0); // error: can't convert to Bar
::foobar(42.0);
Foo f;
foobar(f); // no problem
::foobar(f);
return b;
}
};
也会成功。
为什么这两种情况的表现不同?我同时使用gcc 4.7和clang ++ 3.2。
{{1}}
答案 0 :(得分:8)