3

、GCCとの両方が、次のコードをコンパイルすることができない打ち鳴らす:using宣言は、using宣言の上に宣言されたオーバーロードだけをインポートしますか?例えば

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宣言のみ点以上を宣言オーバーロードをインポートすることを示唆しているが後で出現する可能性のあるもの(名前の使用前)ではなく、使用宣言が表示されます。

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

答えて

6

Is this behaviour correct?

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

The entity declared by a using-declaration shall be known in the context using it according to its definition at the point of the using-declaration. Definitions added to the namespace after the using-declaration are not considered when a use of the name is made.

[ 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 ] 

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

関連する問題