2015-10-28 4 views
5

VS2015は問題なく次のスニペットをコンパイルして実行します。 g ++とclangはコードをリンクしていないので、正しいと思います。N4140の[basic.link]/7に関する私の理解は正しいですか?

#include <iostream> 

namespace X { 
    void p() { 
     void q(); // This is a block scope declaration of the function q() with external 
        // linkage (by §3.5/6), which then must be defined in namespace X, 
        // according to §3.5/7, and not in the global namespace. 
     q(); 
    } 
} 

void q() { std::cout << "q()" << '\n'; } 

int main() 
{ 
    X::p(); 
} 

答えて

4

あなたの例は、[basic.link]/7とほぼ同じです。はい、あなたの解釈は正しいです。
定義されていない関数を使用するqは、プログラムが不正な形でレンダリングされますNDR。したがって、VC++はとなり、技術的にはに適合します。しかし、あなたは間違いなくそれを報告したいと思います。

namespace X { 
    void p() { 
     void q();      
     q(); 
    } 

    void q() { std::cout << "This would be right"; } 
} 

void q() { std::cout << "q()" << '\n'; } 

...しかし、賢明な行動when extern is usedを持っている:VC++ produces the same output( "qは()")我々はqの内側の定義を追加する場合でも、どのように

注意。

+0

なぜNDRですか?この場合リンカはエラーを報告すべきではありませんか? – Belloc

+0

@Belloc実装は必須ではありません。 – Columbo

+0

どこからこのNDRを取得しましたか? – Belloc

関連する問題