8

そんな状況で

namespace n {
    void f() {
        void another_function();
    }
}

関数another_functionは名前空間内nまたは外部で定義する必要がありますか? VS 2012 ( 11 月の CTPを使用) は、外部にある必要があると述べており、Mac の GCC 4.7.2 は内部にある必要があると述べています。間違ったことをすると、リンカーから未定義のシンボル エラーが発生します。

私は通常、GCC の方が標準に準拠していると信じていますが、これは C++ であり、確実なことはありません。

4

2 に答える 2

13

C ++ 11 3.5(およびC ++ 03)

7リンケージを持つエンティティのブロックスコープ宣言が他の宣言を参照していない場合、そのエンティティは最も内側を囲む名前空間のメンバーです。ただし、そのような宣言では、名前空間スコープにメンバー名が導入されません。

あなたの例の宣言はを宣言しますn::another_function

于 2013-01-03T18:38:37.663 に答える
3

N3485 7.3.1 [namespace.def] / 6によると、正解はn::another_functionです。

宣言を囲む名前空間は、元の名前空間の外側にある名前空間メンバーの再宣言(7.3.1.2で指定されている定義など)を除いて、宣言が字句的に現れる名前空間です。このような再宣言には、元の宣言と同じ名前空間が含まれます。[ 例:

namespace Q {
    namespace V {
        void f(); // enclosing namespaces are the global namespace, Q, and Q::V
        class C { void m(); };
    }
    void V::f() { // enclosing namespaces are the global namespace, Q, and Q::V
        extern void h(); // ... so this declares Q::V::h
    }
    void V::C::m() { // enclosing namespaces are the global namespace, Q, and Q::V
    }
}

—例を終了]

于 2013-01-03T18:36:45.353 に答える