Почему разрешение области не работает в присутствии 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 ' global namespace''`

Любые идеи относительно того, почему было разрешено разрешение области, чтобы вести себя таким образом в присутствии decltype?

P.S: Если это имеет значение, я использую MSVC2012 (без Nov CTP)

Ответы

Ответ 1

Это известная ошибка в компиляторе Visual С++. Он еще не исправлен, как в Visual С++ 2013 Preview. Вы можете обойти эту проблему, используя std::common_type:

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

(std::common_type с единственным аргументом шаблона дает этот тип аргумента, это стандартизованный эквивалент С++ 11 шаблона identity, который долго использовался в метапрограммировании.)

Вы можете найти отчет об ошибках в сообществе Microsoft Connect: Невозможно использовать decltype перед оператором области видимости. Если эта проблема важна для вас, подумайте над тем, чтобы опубликовать этот отчет об ошибке.