2016-01-02 8 views

Antwort

12

überlegen Sie, was passieren würde, wenn Sie nicht, dass die Überlastung haben, und versuchen, in einem const rvalue weitergeben müssen:

template <typename T> const T &as_const(T &t) { return t; } 
struct S { }; 
const S f() { return S{}; } 
int main() { 
    // auto & ref = as_const(S()); // correctly detected as invalid already 
    auto & ref = as_const(f()); // accepted 
} 

Diese akzeptiert werden würden, weil T als const S abgeleitet werden würde, und Provisorien binden können const S &. Das Ergebnis wäre, dass Sie versehentlich eine Lvalue-Referenz auf ein temporäres Objekt erhalten, welches direkt nach der Initialisierung von ref zerstört wird. Fast alle Benutzer, die lvales verwenden (ob Variablen oder Funktionsparameter), erwarten nicht, dass sie als Provisorien übergeben werden. Stillschweigendes Akzeptieren von Provisorien bedeutet, dass Sie leicht stillstehende Referenzen erhalten.

+0

@dyp Ja, genau, sonst wäre das kein Problem. :) Vielleicht sollte ich ein bisschen darauf erweitern. Danke T. C. für den Schnitt übrigens hatte ich zunächst ein Beispiel mit einem xvalue aber vergessen, den Text zu aktualisieren, wenn ich das Beispiel vereinfachte. – hvd

+0

Ja mein Kommentar war mehr als eine weitere Erklärung Ihrer Antwort gemeint. Ich bin mir jedoch nicht sicher, ob diese Einschränkung nützlich ist. 'as_const (T const &&)' könnte einfach ein 'T const &&' zurückgeben, und der Compiler warnt davor, eine 'T const & 'Variable an ein' T const && 'in einer Variablendefinition zu binden. – dyp

+1

@dyp Dann könnte es einfach eine 'as_const (T &&)' (keine 'const' drin) geben, die 'T const &&' overload zurückgibt. Ja, das wäre möglich, aber ich vermute, dass das Aufrufen von 'as_const' und das Übergeben eines rvalue eher ein Fehler ist als etwas, das unterstützt werden muss. – hvd

Verwandte Themen