【问题标题】:namespace prefix in function body函数体中的命名空间前缀
【发布时间】:2016-07-12 03:25:45
【问题描述】:

我刚刚经历了一个案例,我不需要在命名空间中声明的函数中为命名空间添加前缀

考虑一下:

namespace fs
{
    void ftest();
    typedef int uint;
}

void fs::ftest()
{
    uint p = 2; // no prefix fs:: needed
}

这实际上并没有让我感到震惊,但我想有一些见解:为什么 in 实际上有效?显然这不是 koenig 查找。

我正在使用 VS 2013

【问题讨论】:

  • 因为它在fs::ftest()里面
  • 什么让您感到惊讶?命名空间中的函数可以访问同一命名空间中的所有内容(非常类似于类中的函数可以访问该类的成员)。这是不言自明的。或者你想要标准的报价?
  • 好吧,我什至不知道,所以我想这是合乎逻辑的。是的,我想引用标准
  • 该过程称为非限定名称查找。不是标准报价,但您可以了解它的工作原理here
  • 谢谢,赞成,因为你是第一个给出进程名称的人

标签: c++ namespaces


【解决方案1】:

这是基本的非限定查找。相关规则在[basic.lookup.unqual]

在函数的 declarator-id 之后的函数定义中使用的名称,它是命名空间 N 的成员(其中,仅出于说明的目的,N 可以表示全局范围)应声明 在使用它的块或其封闭块之一(6.3)之前,应在其在命名空间N中使用之前声明,或者,如果N是嵌套的命名空间,应在 N 之一中使用之前声明 封闭的命名空间。 [示例:

namespace A {
    namespace N {
        void f();
    }
}

void A::N::f() {
    i = 5;
    // The following scopes are searched for a declaration of i:
    // 1) outermost block scope of A::N::f, before the use of i
    // 2) scope of namespace N
    // 3) scope of namespace A
    // 4) global scope, before the definition of A::N::f
}

——结束示例]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多