2014-04-17 5 views
1

Le code suivant ne compile pas sous G ++ 4,8G ++ 4.8, typeof ne peut toujours pas être utilisé avec "::"

#include <vector> 
using namespace std; 

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

Si je remplace typeof à decltype, il fonctionne très bien. Je sais que sur une solution de contournement avec une structure de modèle

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

puis

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

mais son ennuyeux.

Est-ce un bug qui devrait être signalé? Ou c'est une fonctionnalité?

+3

Maintenant que nous avons decltype, typeof est aussi bon que mort. Pourquoi l'utiliser du tout? –

+0

Je n'aime pas ce mot. Typeof sonne mieux et est plus courte de 2 caractères – user31264

+0

* "Je n'aime pas ce mot Typeof sonne mieux et est plus court de 2 caractères" * Aucune de ces raisons n'est une raison valable d'utiliser 'typeof'. – Ali

Répondre

4

Ici, je viens d'écrire n.m.'s comment comme une réponse et d'élargir un peu. En C++ 11, nous avons decltype qui peut être utilisé avec ::. Considérez le code suivant:

#include <vector> 
using namespace std; 

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

Le code ci-dessus proprement avec g++ -std=c++11 -Wall -Wextra -pedantic typeof.cpp compile.

Depuis decltype est standard et already supported by gcc 4.3 (publié en 2008, il ya 6 ans), il n'y a absolument aucune raison d'utiliser l'extension gcc typeof à la place. Votre code sera standard, donc portable, si vous utilisez decltype.

+0

decltype est supporté par gcc 4.3, mais decltype (v) :: itérateur est pris en charge uniquement depuis gcc 4.7 ou 4.8. – user31264

+0

Oh, je ne le savais pas. Il est certainement supporté dans gcc 4.7 car c'est ce que j'ai utilisé :) Et gcc 4.7 a déjà 2 ans. – Ali

+0

J'ai écrit dans ma question "Si je remplace typeof à decltype, ça fonctionne bien.", Donc votre réponse ne fait que répéter ce qui est déjà dans ma question. – user31264

Questions connexes