decltypeで関数の戻り値型を取得しようとすると、VS2012(cl.exe V17.00.60610.1を使用してテスト済み)にADL(引数依存ルックアップ)が含まれません。VS2012のdecltype内にADLがありません
次の例
#include <stdio.h>
#include <typeinfo>
namespace A {
int Func(void const *) {
printf("A::Func(void const *)\n");
return 0;
}
template <typename T> void Do(T const &t) {
Func(&t);
}
template <typename T> void PrintType(T const &t) {
printf("Type: %s\n", typeid(decltype(Func(&t))).name());
}
}
namespace B {
struct XX { };
float Func(XX const *) {
printf("B::Func(XX const *)\n");
return 0.0f;
}
}
int main(int argc, char **argv) {
B::XX xx;
A::Do(xx);
A::PrintType(xx);
return 0;
}
が(予想されるもの)VS2012
に
B::Func(XX const *)
Type: int
を与えるが:GCC 4.7.3に
B::Func(XX const *)
Type: f
を。
したがって、ADLは関数を呼び出すときに機能しますが(出力の1行目)、VS2012のdecltypeの中で使用されているときは機能しません。
また、いくつかの相違点がありますか?
VS2012 'decltype'のサポートはかなり悪いです(" expression SFINAE "を検索して泣く)ので、私はそれほど驚いていません。 – Yakk
多くのC++ 11の機能は、VS2012とそれに続く11月のCTPでアルファ品質の大部分を占めていました。おそらく、VS2013のプレビュー(現在ダウンロード可能なExpress)で修正されたバグのリストが長いと思われます。あなたはあなたの運を試すかもしれません。 – TemplateRex
VS2012以来、バグを解決し、MSが従っていきたい新しい機能を追加するための非常に頻繁な更新の新しい方法は...だから...幸い私はこの特定のプロジェクトのコンパイラの選択に制限されていないので、夢はVS2013に固定されています:-) – mmmmmmmm