Pourquoi ne peut-on pas modifier une rvalue non objet en C++ ?
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 :
Code:
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;
} |
A quoi sert cette différence de règle ?
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++.