C++国际标准化组织2020年草案(6.4.6名称空间范围)在第一段中引用(我用粗体表示):
名称空间定义的声明性区域是其命名空间主体.命名空间体中声明的实体被称为名称空间的成员,这些声明引入名称空间的声明区域中的名称被称为名称空间的成员名称。名称空间成员名具有命名空间范围。的潜在作用域包括从名称的声明点(6.4.2)开始的名称空间(6.4.2)到;对于每个指定成员名称空间的使用指令(9.8.3),成员的潜在作用域包括在成员声明点之后的使用-指令潜在范围的那一部分。
我认为它在未命名命名空间和命名命名空间之间没有区别,但是下面的代码有问题:
#include <iostream>
namespace A {int a = 1;}
namespace {int b = 1;}
void main() {
std::cout << a; // identifier "a" is undefined
std::cout << b;
}卡普普给出了这个问题的原因:
在未命名名称空间或内联命名空间中声明的名称的潜在作用域包括名称在封闭名称空间中声明时可能具有的范围。
但是根据我对这个问题的第一句话的理解,这个错误不应该发生。这里发生何事?
发布于 2021-10-17 13:31:54
我以为它和命名的命名空间没有区别
a和b都可以在main中使用。但是,如果没有范围解析,就不能访问a。文档引用“潜在作用域”、“实际作用域”和“范围”,加上块/类/函数/命名空间范围,可能会引起混淆。
您可以看到命名的和未命名的namespace与以下代码的相似性:
class foo
{
std::string str;
public:
foo(const char* s) { str = s; cout << str << " foo()\n"; }
~foo() { cout << str << " ~foo()\n"; }
};
namespace named { foo a("named"); }
namespace { foo b("unnamed"); }
int main()
{
cout << "start\n";
named::a;
b;
cout << "end\n";
return 0;
}https://stackoverflow.com/questions/69600721
复制相似问题