В G++ 4.8 typeof по-прежнему нельзя использовать с "::"

Следующий код не компилируется под G++ 4.8

#include <vector>
using namespace std;

int main() {
    vector<int> v;
    typeof(v)::iterator it;
}

Если я заменю typeof на decltype, он работает нормально. Я знаю об обходном пути со структурой шаблона

template<class T> struct Self {
    typedef T Type;
};

а потом

Self<typeof(v)>::Type::Iterator it;

но все равно раздражает.

Это ошибка, о которой следует сообщить? Или это особенность?

1 ответ

Здесь я просто записываю комментарий nm в качестве ответа и немного расширяю его.

В C++11 мы имеем decltype который может быть использован с ::, Рассмотрим следующий код:

#include <vector>
using namespace std;

int main() {
    vector<int> v;
    decltype(v)::iterator it;
}

Приведенный выше код компилируется g++ -std=c++11 -Wall -Wextra -pedantic typeof.cpp,

поскольку decltype является стандартным и уже поддерживается gcc 4.3 (выпущен в 2008 году, 6 лет назад), нет абсолютно никаких причин использовать расширение gcc typeof вместо. Ваш код будет стандартным, следовательно, переносимым, если вы используете decltype,

Другие вопросы по тегам