使用命名空间进行函数成员定义

3

我在.h文件中有以下类定义:

namespace N {
    struct S {
        S(); // no definition for member here    
    };
}

我希望在 .cpp 文件中编写类构造函数(成员函数)。我考虑以下两种情况:

  1. namespace N {
        S::S() { /* definition */ }  
    }
    
  2. using namespace N;
    S::S() { /* definition */ }  
    

我有点困惑为什么第二个选项能够工作,因为今天之前从未见过这种定义方式。请提供一些标准引用,以便了解第二个选项是如何工作的。

使用这两种方法有什么微妙的差别?我应该选择第一种还是第二种形式?


如果(2)不起作用,我会感到非常惊讶。显然,(1)和一般的作用域是首选。 - Henri Menke
http://eel.is/c++draft/basic.lookup - Henri Menke
在我看来,using namespace 是用于“使用”,即调用函数、使用变量等情况,而不是用于定义。例如,您不能以同样的方式定义一个类。 - αλεχολυτ
是的,但不止于此。“由using-directive指定的命名空间声明在包含该using-directive的命名空间中可见;” 命名空间也可以是翻译单元的全局命名空间。 - Henri Menke
我认为你必须使用第二个版本来处理未命名的命名空间。 - xskxzr
2个回答

5
(2)之所以有效,是因为以下两点原因:
  1. [class.mfct]/4

    如果成员函数的定义在其类定义之外,则必须使用类名加上​::​运算符限定成员函数名。

  2. [namespace.udir]/2(强调我的)

    using指令指定了在using指令之后的作用域中可以使用指定命名空间中的名称。在未经限定的名称查找期间,这些名称的出现形式好像它们是在包含using指令和指定命名空间的最近封闭命名空间中声明的一样。[注意:在这个上下文中,“包含”表示“直接或间接包含”。—注]。

该指令允许您将S指定为::运算符的名称,就像在N命名空间内一样(如(1)中所示)。但我不会这样做。作用域是好的,定义也应该有作用域。

0
在这个特定的例子中,您只在命名空间中声明了一个结构,并在单独的.cpp文件中定义了函数,因此无论使用1还是2都没关系。
如果您在命名空间中声明了任何其他标识符,那么应该优先使用1,因为using声明会破坏具有命名空间的目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接