3

たとえば、GCC と clang はどちらも次のコードのコンパイルに失敗します。

struct S {};

namespace N
{
    void g(S);
}

using N::g;

namespace N
{
    void g(int);
}

int main()
{
    g(0);
}

エラーで:

test.cpp: In function 'int main()':
test.cpp:17:8: error: could not convert '0' from 'int' to 'S'
     g(0);
        ^

using-declarationは、using-declaration が表示されるポイントより上で宣言されたオーバーロードのみをインポートし、後で表示される可能性があるもの (ただし、名前の使用前) はインポートしないことを示唆しています。

この動作は正しいですか?

4

1 に答える 1

6

この動作は正しいですか?

はい、この動作は正しく、c++標準に従って明確に定義されています。

関連するセクションは、C++11標準の§7.3.3.11です。

using-declarationによって宣言されたエンティティは、using-declarationの時点での定義に従って、それを使用するコンテキストで認識される必要があります。using-declarationの後に名前空間に追加された定義は、名前の使用時に考慮されません。

[ Example:    
    namespace A {
        void f(int);
     }
    using A::f; // f is a synonym for A::f;
    // that is, for A::f(int).
    namespace A {
        void f(char);
    }
    void foo() {
        f(’a’); // calls f(int),
    } // even though f(char) exists.
    void bar() {
        using A::f; // f is a synonym for A::f;
        // that is, for A::f(int) and A::f(char).
        f(’a’); // calls f(char)
    }
 —end example ]
于 2012-05-09T05:00:30.240 に答える