gpt4 book ai didi

c++ - 名称查找歧义不一致

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:36 26 4
gpt4 key购买 nike

我试图理解为什么这个程序没有为 i 提供名称查找歧义:

namespace X { int i = 1; }

namespace Q {
namespace P {
int i = 2;
using namespace X;
}

using namespace P;

int l = i;
}

int main() {}

如果我们像这样修改它,我们会得到名称查找歧义:

namespace X { int i = 1; }

namespace P {
int i = 2;
using namespace X;
}

using namespace P;

int l = i;

int main() {}

我在这里所做的唯一更改是删除命名空间 Q 并将其内容放在全局命名空间中。

我试过 3 种不同的编译器:

所有这些都给出了这封电子邮件中所述的结果,我正试图找出原因。

谁能根据 C++ 标准解释这种行为?看不懂。

最佳答案

在第一个程序中使用的变量 i 定义在命名空间 P 中,因为 using 指令 ​​

using namespace X;

在全局命名空间(X 和 P 的通用命名空间)中放置 X 的声明。因此,P 中 i 的声明(由于另一个 using 指令,在 Q 中更准确)隐藏了全局命名空间中 X::i 的声明。

来自 C++ 标准(3.4.1 非限定名称查找)

2 The declarations from the namespace nominated by a using-directive become visible in a namespace enclosing the using-directive; see 7.3.4.

所以我们有第一个程序

namespace X { int i = 1; }

namespace Q {
namespace P {
int i = 2;
using namespace X; // 1
}

using namespace P; // 2

int l = i;
}

using 指令#1 的封闭命名空间是全局命名空间,using 指令#2 的封闭命名空间是命名空间 Q。

在第二个程序中,由于这两个 using 指令,i 的两个定义都放在全局命名空间中

//...
using namespace X;
//...
using namespace P;

关于c++ - 名称查找歧义不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31490710/

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