为什么在存在decltype的情况下范围解析失败?

Bor*_*der 15 c++ decltype c++11

据我所知,decltype用于查询对象/变量的类型等.

来自维基百科上的示例,如下所示:

int i;
decltype(i) x3; // type is int
Run Code Online (Sandbox Code Playgroud)

我以为我可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

因为毕竟这条线是合法的:

IsClass<std::vector<A>::iterator::value_type>::Yes
Run Code Online (Sandbox Code Playgroud)

唉它不会编译,引用如下:error C2039: 'value_type' : is not a member of '全局命名空间''

关于为什么范围分辨率在这种情况下以decltype的形式表现出来的任何想法?

PS:如果它有任何区别我正在使用MSVC2012(没有 Nov CTP)

Jam*_*lis 10

这是Visual C++编译器中的已知错误.从Visual C++ 2013 Preview开始,它尚未修复.您可以使用std::common_type以下方法解决此问题:

IsClass<std::common_type<decltype(it)>::type::value_type>::Yes
        ^^^^^^^^^^^^^^^^^            ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

(std::common_type使用单个模板参数产生该参数类型;它是标准化的C++ 11等效于identity长期用于元编程的模板.)

您可以在Microsoft Connect上找到公共错误报告: 不能在范围运算符之前使用decltype.如果此问题对您很重要,请考虑更新该错误报告.