代码之家  ›  专栏  ›  技术社区  ›  notamaster

匿名命名空间中的变量声明和其他位置的定义

  •  1
  • notamaster  · 技术社区  · 2 年前

    有人能解释一下为什么我不能在另一个地方将匿名命名空间中声明的变量定义为全局变量吗?

    #include <iostream>
    namespace  {
        extern int number;
    }
    
    int number = 123;
    
    void g() {
        std::cout << number;
    }
    

    编译器说“对‘number’的引用是不明确的”,但我不明白为什么它将声明和定义视为不同的东西?提前谢谢你。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Vlad from Moscow    2 年前

    对于非限定名称查找,编译器还考虑全局命名空间中嵌套的未命名命名空间,

    未命名命名空间的using指令隐式插入到封闭命名空间中。

    考虑以下演示程序

    #include <iostream>
    
    namespace N
    {
        extern int number;
    }
    
    using namespace N;
    
    int number = 123;
    
    int main()
    {
        std::cout << number << '\n';
    }
    

    由于对名称的非限定引用不明确,编译器将发出错误 number 在本声明中

    std::cout << number << '\n';
    

    内联命名空间的7个成员在大多数方面可以用作 参数相关查找中使用的关联命名空间的数量(6.5.3) 只要其中一个在,并且 内联命名空间隐式插入到封闭的 命名空间作为未命名的命名空间

        2
  •  1
  •   Davis Herring    2 年前

    向上看 陷阱

    int x;
    float x;
    

    但是,由于它不是查找,因此不受 using (包括未命名的命名空间)。描述这种区别的另一种方式是声明 将实体放入名称空间,因此不需要考虑任何其他名称空间来决定将实体放在何处。

    也有查找的情况 声明器id :

    namespace N {using X=int;}
    // using namespace N;
    struct A {
      A(X());  // ?
    };
    

    A 具有没有返回参数的成员函数 已命名 X (声明符周围有无意义的括号);然而,随着 int .同样,在开始的声明中

    template<>
    struct X<…
    

    必须完全查找X,即使显式专门化的声明必须与 模板(对于内联命名空间有一定的余地),因为它可能会继续

    template<>
    struct X<int>::Y<char> {…};
    

    而不是专业化的

    推荐文章