2016-03-24 10 views
9

は、このコードを考えてみましょう:コンパイラの不一致:エイリアス解像度と名のルックアップの間の相互作用

using type = long; 

namespace n { 
    using type = long; 
} 

using namespace n; 
int main() { 
    type t; 
} 

これはClang 3.7GCC 5.3にきれいにコンパイルしますが、MSVC 19 *は、次のエラーメッセージを表示します。

main.cpp(9): error C2872: 'type': ambiguous symbol 
main.cpp(1): note: could be 'long type' 
main.cpp(4): note: or  'n::type' 

はこれですコードは整形式ですか?曖昧さチェックの前にエイリアスが解決されるかどうかは、標準のどの部分に記載されていますか?あなたはそれらのエイリアスのいずれかを変更した場合クランとGCCは両方MSVCに同様のエラーを与えること


注意。

名前の修飾がどのようにあいまいさを解決するのかを十分に理解していますが、私は標準がこれについて言いたいことに興味があります。


* - パーマリンクとオンラインMSVCコンパイラ

答えて

4

[namespace.udir]/6があるかどうジャストコードを貼り付けて、そのリンクでそれを実行して、私は知らない。

は、名前の検索が見つかった場合は、 2つの異なる名前空間での名前の宣言であり、宣言のは同じエンティティを宣言しておらず、関数を宣言していないため、その名前の使用は不正です。

しかし、これらは同じタイプを参照する名前を宣言しているため、プログラムは整形式でなければなりません。この解釈は、 core issue 1894にコメントすることにより確認:

//[..] 

    namespace C { 
    // The typedef does not redefine the name S in this 
    // scope, so issue 407's resolution does not apply. 
    typedef A::S S; 
    using A::S; 
    // **The name lookup here isn't ambiguous, because it only finds one 
    // entity**, but it finds both a typedef-name and a non-typedef-name referring 
    // to that entity, so the standard doesn't appear to say whether this is valid. 
    struct S s; 
    } 
-1

7.3.4/6:

名前の検索は、2つの異なる 名前空間の名前の宣言を見つけ、宣言が同じ実体を宣言しない場合そして は機能を宣言していません、その名前の使用は不正です。

+1

あなたは本当ですか? – Columbo

+0

@Columbo、私はあなたの前に私の答えを掲載しました。私は自分でそれを取り除くだろうが、私は今それを残すだろう - それを誰でもやったのは間違っていた。 – SergeyA

関連する問題