gpt4 book ai didi

c++ - 命名空间名称在范围内必须是唯一的。为什么?

转载 作者:行者123 更新时间:2023-11-28 00:07:17 27 4
gpt4 key购买 nike

为什么 namespace 名称在其范围内必须是唯一的似乎很明显:

namespace test{}

int test = 10; //error 'int test' redeclared as different kind of symbol

但编译器似乎能够区分名称是引用变量还是命名空间:

#include <iostream>

namespace test{
int x = 2;
}

int main(){

int test = 5;

using namespace test; //I was expecting an error to occur here.
std::cout << test::x << std::endl;

}

在这段代码中,编译器 (g++ 5.2.0) 不会对 test 的 using 指令或在 test 上使用范围运算符大惊小怪,尽管事实上有一个名为 test 的局部变量。上下文似乎清楚地表明它指的是一个 namespace ,因此名称查找(如果名称查找甚至发生)跳过 int 变量 test 以在全局中查找 namespace 范围。

因此,如果编译器可以区分 namespace 的使用,为什么第一个示例会出现问题?是否存在表达式可能引用变量或命名空间的上下文?

最佳答案

在同一范围内的两个不同的同名声明是导致问题的原因。

在您的第二个示例中,命名空间位于外部范围,而变量定义位于内部范围。这提供了一种在两者之间做出决定的明确方法。在少数情况下仍然可能产生歧义,但至少定义本身不会冲突。

在您的第一个示例中,您可以定义一种允许在同一范围内进行歧义定义的语言,只要每个定义只以一种不歧义的方式使用。然而,C++ 的设计者决定避免这种情况(在 IMO 中,这是正确的——如果有的话,C++ 已经允许太多让大多数人感到模棱两可的事情,尽管规则确实明确了编译器需要做什么)。

至于第二个示例能够找到 namespace,即使它是在外部作用域定义的,它被变量定义遮蔽(隐藏):这是真的,但是 你只被允许在任何函数之外定义一个命名空间,所以在 using 指令中(你的 using namespace ...)编译器甚至从不查看函数内部以查看变量定义,因为无论如何,你不能在那里定义命名空间。

关于c++ - 命名空间名称在范围内必须是唯一的。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34864935/

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