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
etend_expr
sont définies comme suit:
- Si range_expression est une expression de type tableau, puis
begin_expr
est__range
etend_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 classeC
qui a un membre nommébegin
et/ou un membre nomméend
(quel que soit le type ou l'accessibilité de ce membre), puisbegin_expr
est__range.begin
) etend_expr
est__range.end()
;- Sinon,
begin_expr
estbegin(__range)
etend_expr
estend(__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.
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?
Hmm. Bon à savoir. – Adrian
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