2012-05-22 17 views
11
struct X{}; 

template<class T> 
decltype(X() == int()) f(T const&){ return true; } 

int main(void) { 
    X x; 
    f(x); 
} 

なぜ、ちょうどなぜoperator==は、と定義されています。次のコードはなぜMSVC++でコンパイルされますか?

MS Connectの詳細なバグレポートを提供するために、ここで何が起こっているのかを本当に理解したいと思います。狂気への私の旅は

...ラウンジ< C++>チャットルームにhereまわり始めた(注:GCCもクランはいずれも、このコードを受け入れる)

ああ、ところで、民間X(int) ctorのは、原因となる追加

struct X{ 
    X(){} 
private: 
    X(int); 
}; 

template<class T> 
decltype(X() == int()) f(T const&){ return true; } 

int main(void) { 
    X x; 
    f(x); 
} 

出力:

1>src\main.cpp(12): error C2248: 'X::X' : cannot access private member declared in class 'X' 
1>   src\main.cpp(4) : see declaration of 'X::X' 
1>   src\main.cpp(1) : see declaration of 'X' 
+0

他のコンパイラはそれを受け入れますか? –

+0

@Billy:いいえ、その情報を追加しました。背景情報:私はMSVCがC++のチャットルームで何をしているのか、頭がおかしくなり、数時間後にあきらめました。 – Xeo

+0

背景情報を少し追加しました。また、匿名のdownvoterはdownvoteの理由を声を出してください? – Xeo

答えて

7

MS VC++ Aのどのバージョンを失敗するコンパイルあなたは使いますか?私はそれは私が今までで最も有用または有益なエラーメッセージを呼びたいものだわからないんだけど、それ

trash.cpp(8): error C2893: Failed to specialize function template ''unknown-type' f(const T &)' 
      With the following template arguments: 
      'X' 

:それは価値があるかもしれ何でも、VC++ 11のベータ版は、とあなたのコードを拒否するために

です。

状況の下で、私はバグレポートを提出すると思われますが、おそらくほとんど(もしあれば)達成する予定です。私が期待していたのは、基本的には「VC++ 11で既に修正されています。

+0

そして、私は実際にVS11ベータ版を使っていたと思っていました...正確なバージョンはありますか?私の "バージョン11.0.40825.2 PREREL"。 – Xeo

+1

@ Xeo:Version 11.0.50214.1 BETAREL "ベータ版ではなくテクノロジープレビューがあると間違っていないとすれば、 –

+0

そのためには本当に*実際のベータ版をダウンロードしてから、後で確認してください – Xeo

関連する問題