decltype を介して関数の戻り値の型を取得しようとすると、VS2012 で ADL (argument-dependent-lookup) が含まれないことに気付きました (cl.exe V17.00.60610.1 を使用してテスト)。
次の例
#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;
}
与える
B::Func(XX const *)
Type: int
VS2012で
しかし(予想されること):
B::Func(XX const *)
Type: f
gcc 4.7.3 で。
そのため、ADL は関数 (出力の 1 行目) を呼び出すときに機能しますが、VS2012 の decltype 内で使用すると機能しません。
それとも、別のポイントがありませんか?