Pourquoi ne peut-on pas modifier une rvalue non objet alors que l'on peut appeler une fonction membre non constante sur une rvalue objet non constante ?
Notamment, pourquoi n'a-t-on pas le droit de faire une pré-incrémentation sur un pointeur nu qui est une rvalue alors qu'on a le droit d'appeler operator++ sur une rvalue objet non constante ?
Exemple avec g++ 6.2.0 :
A quoi sert cette différence de règle ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include <set> #include <array> int main() { std::set<int> set = {0, 1, 2, 3}; std::array<int, 4> tab = {0, 1, 2, 3}; auto setIt = ++set.begin(); // Compile, car std::set<int>::iterator est un objet. auto tabIt = ++tab.begin(); // Ne compile pas, car std::array<int, 4>::iterator est un pointeur nu. return 0; }
Je sais que le code générique pour récupérer un itérateur vers le deuxième élément d'un conteneur de la STL est std::next(conteneur.begin()).
Mais je trouve dommage qu'il faille passer par un modèle de fonction std::next pour contourner le fait que ++conteneur.begin() ne compile pas avec certains conteneurs. Je pense que cela complique inutilement l'apprentissage de la programmation générique en C++.
Partager