我相信§7.3.1.2/ 1中的例子是不正确的

时间:2014-09-02 13:18:05

标签: c++ c++11 namespaces language-lawyer

§7.3.1.2/ 1

  

成员(包括模板的明确专业化(14.7.3))   可以在该命名空间中定义命名空间。 [例如:

namespace X {
    void f() { / ... / }
}

为了在命名空间中定义函数,您必须使用其中一个说明符:staticinline。我是对的吗?

3 个答案:

答案 0 :(得分:4)

没有。您可以在具有非内联外部链接的命名空间中定义它,只要程序中只有一个定义(以满足一个定义规则的要求)。

通常,这意味着您可以在源文件中定义它(因此它只在一个翻译单元中定义一次),但必须声明它inline(或可能{{} 1}},或在未命名的命名空间中,在异常情况下)如果您在标题中定义它,可能包含在多个翻译单元中。但这与定义是否在其命名空间内无关。

答案 1 :(得分:3)

你可以想象你有一个带声明的头文件:

namespace X {
    void f();
}

翻译单元,包括此标题,包含以下内容:

namespace X {
    void f() { / ... / }
}

作为替代:

void X::f() { / ... / }

或者包含与X::f无关的任何内容的翻译单元,它们都声明并定义了该函数:

namespace X {
    void f() { / ... / }
}

答案 2 :(得分:2)

即使没有标题,您也可以使用包含以下内容的.cpp文件:

namespace X {
    void f() { / ... / }
}

如果它仅包含在一个翻译单元中,您可以将其添加到标题中

此外,即使标题包含在多个翻译单元中,它也可以是这样的:

namespace {
    namespace X {
        void f() { / ... / }
    }
}