gpt4 book ai didi

c++ - 特殊的 C++[错误]?

转载 作者:IT老高 更新时间:2023-10-28 23:14:57 26 4
gpt4 key购买 nike

我一直在阅读 Herb Sutter 的 Exceptional C++。到达 Item 32

我找到了以下

 namespace A 
{
struct X;
struct Y;
void f( int );
void g( X );
}
namespace B
{
void f( int i )
{
f( i ); // which f()?
}
}

This f() calls itself, with infinite recursion. The reason is that the only visible f() is B::f() itself.

There is another function with signature f(int), namely the one in namespace A. If B had written "using namespace A;" or "using A::f;", then A::f(int) would have been visible as a candidate when looking up f(int), and the f(i) call would have been ambiguous between A::f(int) and B::f(int). Since B did not bring A::f(int) into scope, however, only B::f(int) can be considered, so the call unambiguously resolves to 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 声明(using A::f)和 using 指令(using namespace A)之间存在细微差别。

using 声明将名称引入使用它的范围,因此 using A::fB 的定义中调用 f::f(int) 模棱两可。

using 定义使命名空间的成员在使用它的范围内可见,但它们出现就好像名称来自所引入的命名空间的最近公共(public)范围以及其中的命名空间使用了 using 指令。这意味着 using namespace A; 在这种情况下使另一个 f 看起来好像它是在全局范围内声明的,但它仍然被 B::隐藏: f(int).

(ISO/IEC/BS 14882:2003 7.3.4 [namespace.udir]/1 适用于所有标准爱好者。)

关于c++ - 特殊的 C++[错误]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3039615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com