首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命名空间作用域如何在C++中工作?

命名空间作用域如何在C++中工作?
EN

Stack Overflow用户
提问于 2021-10-17 01:32:42
回答 1查看 106关注 0票数 1

C++国际标准化组织2020年草案(6.4.6名称空间范围)在第一段中引用(我用粗体表示):

名称空间定义的声明性区域是其命名空间主体.命名空间体中声明的实体被称为名称空间的成员,这些声明引入名称空间的声明区域中的名称被称为名称空间的成员名称。名称空间成员名具有命名空间范围。的潜在作用域包括从名称的声明点(6.4.2)开始的名称空间(6.4.2)到;对于每个指定成员名称空间的使用指令(9.8.3),成员的潜在作用域包括在成员声明点之后的使用-指令潜在范围的那一部分。

我认为它在未命名命名空间和命名命名空间之间没有区别,但是下面的代码有问题:

代码语言:javascript
复制
#include <iostream>
namespace A {int a = 1;}
namespace {int b = 1;}
void main() {
    std::cout << a; // identifier "a" is undefined
    std::cout << b;
}

卡普普给出了这个问题的原因:

在未命名名称空间或内联命名空间中声明的名称的潜在作用域包括名称在封闭名称空间中声明时可能具有的范围。

但是根据我对这个问题的第一句话的理解,这个错误不应该发生。这里发生何事?

EN

回答 1

Stack Overflow用户

发布于 2021-10-17 13:31:54

我以为它和命名的命名空间没有区别

ab都可以在main中使用。但是,如果没有范围解析,就不能访问a。文档引用“潜在作用域”、“实际作用域”和“范围”,加上块/类/函数/命名空间范围,可能会引起混淆。

您可以看到命名的和未命名的namespace与以下代码的相似性:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69600721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档