2016-05-23 6 views
3

Lassen Sie uns sagen, dass ich eine einfache C++ Klasse, die ein eigenes Element und ein Getter enthält:Schlüsselwort auto Verhalten mit Referenzen

class MyClass 
{ 
    private: 
     double m_testValue = 1; 

    public: 
     double& getTestValue(){return m_testValue;} 
} 

Lassen Sie uns jetzt sagen, ich will den Getter nennen meine Referenz zu bekommen und diesen Wert bearbeiten (und das Drucken vor/nach Wert)

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; 

Der Ausgang ist

1 
1 
1 
3 

Dies ist nicht genau w Hut ich erwartet, da offenbar m_testValue nicht bearbeitet wurde. Ja, wenn ich ersetzen Auto mit Doppel &:

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; 

ich

1 
1 
3 
3 

Was ist das, was ich will. So ist die Frage: Ist dies das erwartete Verhalten des Schlüsselwortes auto oder ist es ein Fehler? Wenn dies erwartet wird, was ist der Grund für dieses Verhalten? Ist es eine technische Einschränkung? Wenn es von Entwurf und warum?

+0

'Auto' funktioniert genau wie Vorlagentyp Abzug, mit einer nicht verwandten Ausnahme. – chris

+0

Beachten Sie, dass Sie in C++ 14 mit 'declltype (auto)' das gewünschte Verhalten erhalten können. – TartanLlama

+0

In diesem Kommentar geht es nicht um Ihr Problem. In deinem Code gibt es ein Problem mit dem Design: Eine Methode muss const 'const double & getTestValue() const noexcept {return m_testValue;}' sein. In diesem speziellen Fall vielleicht Rückkehr durch Referenz es ist irrilvant –

Antwort

6

Wenn auto abgeleitet wird, ist es nicht auf die Referenz abgeleitet. Es leitet immer auf den Wert ab. Wenn Sie einen Verweis auf den zurückgegebenen Wert haben möchten, können Sie auto&, const auto& oder auto&& haben.

Und ja, es ist von Entwurf. Jedes andere Verhalten wäre tatsächlich ziemlich überraschend. Was noch schlimmer ist, ist es einfach, eine Referenz zu verwenden, wenn Sie möchten. Stellen Sie sich jedoch vor, dass auto tatsächlich auf die Referenz abgeleitet werden würde. Wie würdest du es (syntaktisch) zu einem Wert machen?

+0

Ich wusste nicht über die Auto & Syntax! Dies macht den Zweck und die Verwendung von 'auto' klarer. Vielen Dank –

Verwandte Themen