2017-11-28 3 views
0

Betrachten Sie den folgenden Code.Hinterer Rückgabetyp für Referenz

#include <iostream> 

class A { 

public: 
    using T = float; 
    A(const T& x) 
    { 
     m_value = x; 
    } 

    T& value(); 

private: 
    T m_value; 
}; 

// A::T& A::value() 
// { 
//  return m_value; 
// } 

auto& A::value() -> T & 
{ 
    return m_value; 
} 

int main() 
{ 
    A a(10.0); 
    std::cout << a.value() << std::endl; 

    return 0; 
} 

Beim Kompilieren mit C++ 11, erhalte ich den folgenden Fehler.

error: ‘value’ function with trailing return type has ‘auto&’ as its type rather than plain ‘auto’ 
    auto& A::value()->T & 
        ^

Der entsprechende Code (die kommentierte Funktion) funktioniert einwandfrei. Aber ich möchte Trailing-Return-Typ verwenden.

+5

Tun Sie einfach was der Fehler vorschlägt und schreiben Sie 'auto A :: value() -> T &'. –

Antwort

5

Wenn Sie die hintere Rückgabetyp verwenden möchten, können Sie nichts anderes haben als auto an dem Ort, wo Sie normalerweise den Rückgabetyp setzen würde:

auto A::value()->T & 
//^no '&' here 
{ 
    return m_value; 
} 

Der Typ, den Sie nach dem -> angegeben ist bereits ein Hinweis, also keine Sorgen.

+0

Ich würde empfehlen, diesen ersten Satz umzuformulieren; 'auto' ist nie ein" Rückgabetyp ". Es ist ein Spezifizierer, der in diesem Fall keinen anderen Zweck hat, als eine Syntax zur Angabe des Rückgabetyps nach Funktionsparametern anzugeben. – oisyn

+0

@oisyn Einverstanden. Geändert danke :) – Rakete1111