2013-08-13 3 views
0

Dire que j'ai le code suivant:Type de iterator pour la gamme basée sur boucle

std::vector<std::string> foo({"alice", "bob"}); 
for (const std::string &f : foo) 
    std::cout << f.size() << std::endl; 

si je fais une erreur et de changer f.size() à f->size(), je reçois l'erreur suivante de GCC:

error: base operand of ‘->’ has non-pointer type ‘const string {aka const std::basic_string}

Pourquoi le type actuel est-il const std::basic_string<char> plutôt que const std::basic_string<char> & (référence)?

+0

Ce que vous conduit à penser que ce n'est pas 'const std :: basic_string &'? – juanchopanza

+0

le message du compilateur un peu cryptique probablement .. – stijn

+0

Qu'est-ce que cela a à voir avec les itérateurs? Parce que 'f' n'est pas un itérateur. –

Répondre

1

Le côté gauche de l'opérateur -> est une expression. Il n'y a pas aucune telle chose comme une expression avec un type de référence:

5p5 If an expression initially has the type “reference to T” (8.3.2, 8.5.3), the type is adjusted to T prior to any further analysis. The expression designates the object or function denoted by the reference, and the expression is an lvalue or an xvalue, depending on the expression.

+0

Bonne réponse, merci, cela fait beaucoup plus de sens maintenant. – tmatth

Questions connexes