À partir de ce Visual C++ article de blog sur les références rvalue:
... Le C++ ne veut pas que vous accidentellement
modifier temporaires, mais directement
l'appel d'une non-const fonction de membre sur
modifiable rvalue est explicite, donc
c'est autorisé ...
Fondamentalement, vous ne devriez pas essayer de modifier temporaires pour la raison qu'ils sont des objets temporaires et va mourir à tout moment maintenant. La raison pour laquelle vous êtes autorisé à appeler non-const méthodes est que, eh bien, vous êtes les bienvenus pour faire un peu de "stupide" choses aussi longtemps que vous savez ce que vous faites et vous sont explicites à ce sujet (comme, à l'aide de reinterpret_cast). Mais si vous liez un temporaire à un non-const de référence, vous pouvez garder le passant autour de "pour toujours" juste pour avoir votre manipulation de l'objet disparaître, parce que quelque part le long du chemin, vous avez complètement oublié que c'était temporaire.
Si j'étais vous, je voudrais repenser la conception de mes fonctions. Pourquoi est g() acceptant de référence, est-il de modifier le paramètre? Si non, faire const référence, si oui, pourquoi avez-vous essayez de passe temporaire à elle, vous n'avez pas de soins temporaire de modification? Pourquoi est-getx() renvoi temporaire de toute façon? Si vous partagez avec nous votre vrai scénario et de ce que vous voulez accomplir, vous pouvez obtenir quelques bonnes suggestions sur la façon de le faire.
Allant à l'encontre de la langue et de tromper le compilateur rarement résout des problèmes - habituellement, il crée des problèmes.
Edit: répondre à des questions en commentaire:
1) X& x = getx().ref(); // OK when will x die?
- je ne sais pas et je n'aime pas, parce que c'est exactement ce que je veux dire par "aller à l'encontre de la langue". Le langage dit "temporaires mourir à la fin de l'instruction, sauf s'ils sont liés à const référence, dans ce cas, ils meurent lorsque la référence est hors de portée". L'application de cette règle, il semble que x est déjà mort au début de la prochaine instruction, car il n'est pas lié à const de référence (le compilateur ne sait pas ce qu'ref() retourne). C'est juste une supposition.
2) je l'ai dit le but clairement: vous n'êtes pas autorisé à modifier temporaires, parce qu'il n'a tout simplement pas de sens (en ignorant C++0x références rvalue). La question "alors, pourquoi suis-je autorisé à appeler non-const membres?" est une bonne idée, mais je n'ai pas de meilleure réponse que celle que j'ai déjà indiqué ci-dessus.
3) eh Bien, si je suis à droite sur x en X& x = getx().ref();
mourir à la fin de l'énoncé, le problème est évident.
De toute façon, basé sur votre question et les commentaires que je ne pense pas que même ces réponses seront vous satisfaire. Voici une tentative finale/résumé: Le C++ comité a décidé qu'il n'est pas judicieux de modifier temporaires, par conséquent, ils ont refusé de liaison à la non-const références. Peut-être certains d'implémentation de compilateur ou de l'historique des questions ont également été impliqués, je ne sais pas. Puis, quelques cas spécifiques ont émergé, et il a été décidé que, contre toute attente, ils auront toujours la possibilité de la modification directe par le biais de l'appel à la non-const méthode. Mais c'est une exception - vous n'êtes pas autorisés à modifier temporaires. Oui, le C++ est souvent bizarre.