【发布时间】:2011-03-03 15:34:04
【问题描述】:
我一直在阅读Exceptional C++ by Herb Sutter。到达Item 32
我找到了以下
namespace A
{
struct X;
struct Y;
void f( int );
void g( X );
}
namespace B
{
void f( int i )
{
f( i ); // which f()?
}
}
这个 f() 调用自身,无限递归。原因是唯一可见的 f() 是 B::f() 本身。
还有另一个函数签名为 f(int),即命名空间 A 中的函数。如果 B 写为 "using namespace A;" 或 "using A::f;",则 A ::f(int) 在查找 f(int) 时作为候选者是可见的,并且 f(i) 调用在 A::f(int) 和 B::f(int) 之间是不明确的。但是,由于 B 没有将 A::f(int) 纳入范围,因此只能考虑 B::f(int),因此该调用明确地解析为 B::f(int)。
但是当我执行以下操作时..
namespace A
{
struct X;
struct Y;
void f( int );
void g( X );
}
namespace B
{
using namespace A;
void f( int i )
{
f( i ); // No error, why?
}
}
这意味着 Herb Sutter 搞错了?如果不是,为什么我没有收到错误消息?
【问题讨论】:
-
某事不是编译时错误并不意味着它具有明确定义的语义。
-
但是写
using A::f会导致编译时出错。 -
根据您的图书版本,最长可达 11 年。 C++03 和 C++0x 中的任何更改都不会反映在其示例中。 (我不知道,但我怀疑这在他第一次写的时候有效。)
标签: c++