2013-07-06 9 views
15

decltypeはオブジェクト/変数のタイプなどを照会するために使用されることは私の理解です。次のようなウィキペディアに存在する例から、なぜdecltypeの存在下でスコープ解決が失敗するのですか?

int i; 
decltype(i) x3; // type is int 

は、私はこのような何かを行うことができ仮定:

class A 
{ 
public: 
    int a, b; 
}; 

template<typename T> 
struct IsClass 
{ 
    enum { Yes = std::is_class<T>::value }; 
    enum { No = !Yes }; 
}; 

std::vector<A> v; 
auto it = v.begin(); 
IsClass<decltype(it)::value_type>::Yes 

すべてこの行は合法である後ので:

IsClass<std::vector<A>::iterator::value_type>::Yes 

これは、次の理由でコンパイルされませんでした。error C2039: 'value_type' : is not a member of 'グローバル名前空間 '' `

なぜ、スコープ解決がdecltypeの存在下でこのように動作するのかについてのアイデアはありますか?

P.S:それは(11月のCTPなし)MSVC2012を使用して私はすべての違いを作る場合

+5

'gcc'と'これを受け入れるように見えるclang':http://coliru.stacked-crooked.com/view?id=bc884ca6b1f51d36c231f2eb08dec3ad-f674c1a6d04c632b71a62362c0ccfc51 –

+0

@ShafikYaghmour私はちょうど私が使用しているどのMSVC2012にこれを貼り付け(Iこの効果のノートを追加しました)、コンパイルされません。 – Borgleader

+3

MSVCはうまくいっていますが、gccとclangと同じ標準を実装していません。 – aaronman

答えて

10

これは、Visual C++コンパイラでの既知のバグです。 Visual C++ 2013プレビューの時点でまだ修正されていません。あなたはstd::common_typeを使用してこの問題を回避することができます

IsClass<std::common_type<decltype(it)>::type::value_type>::Yes 
     ^^^^^^^^^^^^^^^^^   ^^^^^^^ 

(単一テンプレート引数利回り引数の型とstd::common_type;それは長いメタプログラミングで使用されてきたidentityテンプレートの標準化されたC++ 11と同等です。)

公開されているバグレポートは、Microsoft ConnectのCannot use decltype before scope operatorにあります。この問題があなたにとって重要な場合は、そのバグレポートをアップグレートすることを検討してください。

+1

なぜ彼らは 'std :: identity'と呼べないのか分かりません。他のみんなのように。 –

+0

@LightnessRacesinOrbit:前に 'std :: identity'がありましたが、正確に何をすべきかが不明であったため削除されました(' std :: common_type 'のようなメタプログラミングアイデンティティは今や機能的なアイデンティティですか? 、IIRC。 – Xeo

+0

軌道上の@ Lightness Races:それは、それを「呼び出す」もののようには見えません。 'std :: common_type'の機能は' std :: identity'よりも広いです。単に 'std :: identity'もカバーします。ですから、本当に 'std :: identity'をもっと美しいものにしておくのか、それを冗長なものとして取り除くのかという疑問がありました。彼らはそれを取り除いた。 – AnT

関連する問題