2009-11-20 3 views
0

Consultez le code suivant:Est-il possible d'utiliser un RA-itérateur hors de portée?

typedef std::vector<int> cont_t; // Any container with RA-iterators 
typedef cont_t::const_iterator citer_t; // Random access iterator 

cont_t v(100); 
const int start = 15; // start > 0. 
citer_t it = v.begin() - start; // Do not use *it 

int a1 = 20, b1 = 30; // a1, b1 >= start 
int a2 = 30, b2 = 40; // a2, b2 >= start 

int x = std::min_element(it + a1, it + b1); // 
int y = std::min_element(it + a2, it + b2); // 
int z = std::min_element(it + 15, it + 25); // 
... 

Est-il possible d'utiliser le iterator d'accès aléatoire it hors de portée?

Répondre

3

Vous obtiendrez état d'assertion ici selon C++ standard 24.1.5 Tableau 76.

+0

Seulement en mode débogage je suppose? –

+0

Standard ne mentionne rien sur le mode de débogage. –

+3

La table indique la condition préalable qui est violée. C'est entièrement à la mise en œuvre si elle vérifie ou assume les conditions préalables. –

5

Il est certainement possible d'écrire du code qui essaye d'utiliser un hors de portée iterator. L'exécution du code donnera un comportement indéfini. En fonction de l'implémentation de la librairie, il peut lancer une exception, accéder à des bits de mémoire aléatoires, déclencher une erreur de protection ou initier une explosion thermonucléaire dans votre CPU.

+0

Je doute de l'explosion thermonucléaire. Pas assez de masse initiale. –

+2

@Konrad Rudolph, Cela dépend du modèle de CPU. –

Questions connexes