comportement automatique des mots clés avec des références

Disons que j’ai une classe simple c ++ qui contient un membre privé et un getter:

class MyClass { private: double m_testValue = 1; public: double& getTestValue(){return m_testValue;} } 

Maintenant, disons que je veux appeler le getter pour obtenir ma référence et éditer cette valeur (et imprimer les valeurs avant / après)

 auto testVal = myClassInstance.getTestValue(); std::cout << myClassInstance.getTestValue() << std::endl; std::cout << testVal << std::endl; testVal = 3; std::cout << myClassInstance.getTestValue() << std::endl; std::cout << testVal << std::endl; 

La sortie est

 1 1 1 3 

Ce n’est pas exactement ce à quoi je m’attendais depuis qu’apparemment, m_testValue n’a pas été édité. En effet, si je remplace auto par double &:

 double& testVal = myClassInstance.getTestValue(); std::cout << myClassInstance.getTestValue() << std::endl; std::cout << testVal << std::endl; testVal = 3; std::cout << myClassInstance.getTestValue() << std::endl; std::cout << testVal << std::endl; 

Je reçois

 1 1 3 3 

C’est ce que je veux. La question est donc la suivante: s’agit-il du comportement attendu du mot clé auto ou s’agit-il d’un bogue? Si cela est prévu, quelle est la raison de ce comportement? est-ce une limitation technique? Si cela est voulu et pourquoi?

Lorsque auto est déduit, il n’est pas déduit de la référence. Il en déduit toujours à la valeur. Si vous voulez avoir une référence à la valeur renvoyée, vous pouvez avoir auto& , const auto& ou auto&& .

Et oui, c’est par conception. Tout autre comportement serait en fait assez surprenant. Pire encore, il est facile d’utiliser une référence quand vous le souhaitez. Cependant, imaginons que l’ auto serait déduit de la référence. Comment en feriez-vous (syntaxiquement) une valeur?