2017-10-10 2 views
1

Selon gamme à base de la documentation en boucle here:La plage basée sur la boucle ne fonctionne pas avec le pointeur même lorsque begin()/end() est défini pour cela?

begin_expr et end_expr sont définies comme suit:

  • Si range_expression est une expression de type tableau, puis begin_expr est __range et end_expr est (__range + __bound), où __bound est le nombre d'éléments dans le tableau (si le tableau a une taille inconnue ou est de type incomplet, le programme est mal formé)
  • Si range_expression est une expression d'un type de classe C qui a un membre nommé begin et/ou un membre nommé end (quel que soit le type ou l'accessibilité de ce membre), puis begin_expr est __range.begin) et end_expr est __range.end();
  • Sinon, begin_expr est begin(__range) et end_expr est end(__range), que l'on trouve par l'intermédiaire d'argument-dependent lookup (recherche non-ADL est pas effectué).

Cependant, si je définis pour un type de pointeur begin() et end(), il ne fonctionne pas.

Exemple

#include <iostream> 

using LPCSTR = char const*; 

LPCSTR begin(LPCSTR str) 
{ 
    return str; 
} 

LPCSTR end(LPCSTR str) 
{ 
    return str + strlen(str); 
} 

int main() 
{ 
    LPCSTR text = "Hello, world!\n"; 
    for (auto c : text) 
    { 
     std::cout << c; 
    } 
} 

erreur (s):

source_file.cpp:18:17: error: invalid range expression of type 'const char *'; no viable 'begin' function available 
    for (auto c : text) 
       ^~~~~ 
1 error generated. 

Demo

Je ne vois aucune référence que les pointeurs sont exclus de l'ADL, alors quelle raison y aurait-il pourquoi cela ne fonctionne pas?

Répondre

2

[basic.lookup.argdep]/2 Pour chaque type d'argument T dans l'appel de fonction, il y a un ensemble de zéro ou plus namespaces associés et un ensemble de zéro ou plusieurs classes associées à considérer ...

(2.1) - Si T est un type fondamental, ses ensembles d'espaces de noms et de classes associés sont vides ...

(2,4) - Si T est un pointeur vers U ou un tableau de U, ses espaces de noms et classes associées sont celles associées à U ...

De ceux-ci, un ensemble de namespaces asscociated avec char const* est vide, donc il n'y a rien à regarder pour ADL.

+0

Hmm. Bon à savoir. – Adrian

+0

Savez-vous s'il y avait une motivation pour cela ou est-ce simplement parce que c'est ainsi qu'ils l'ont défini? – Adrian

0

La question est cette partie:

recherche non ADL n'est pas effectué

begin et end dans ce contexte serait trouvé par recherche non-ADL, plutôt que LDA depuis des pointeurs Aren 't' défini dans l'espace de noms global ".