2017-08-06 3 views
18

Ich verstehe nicht, warum der folgende Code auf GCC kompiliert 8.0:Warum bindet diese Rvalue-Referenz an einen Lvalue?

decltype(auto) foo(int&& r) { 
    return r; 
} 

In foo ist die Erklärung Art von rint&&, und so der Rückgabetyp von foo ist auch int&&. Aber r selbst ist ein Lvalue, und ein Lvalue kann nicht an eine Rvalue-Referenz binden.

Fehle ich etwas?

+0

Reproduziert mit [gcc8] (https://wandbox.org/permlink/4CSGrHnZ26nGL8QK), es scheint gcc8 abgeleitete den Rückgabetyp zu sein "Int &". – songyuanyao

+0

@songyuanyao Sie behaupten, der Code kompiliert, so dass es keine Repro wäre. –

+1

@BaummitAugen Der feste Code kompiliert mit [gcc8] (https://wandbox.org/permlink/7mUFIa2VVAwgprEM), aber nicht [clang6] (https://wandbox.org/permlink/3lpIoyciSWUisYh7). – songyuanyao

Antwort

14

Gemäß [dcl.spec.auto]/5 wird der Rückgabetyp so abgeleitet, als ob der Operand der Anweisung return der Operand decltype wäre. Und [dcl.type.simple]/(4.2) besagt klar, dass, da der Operand nicht geklammert ist, der Typ der Entität der Typ ist, der von decltype, also int&&, erhalten wird. Und tatsächlich ist r ein L-Wert ([expr.prim.id.unqual]).

Zum Glück wurde dies vor zwei Jahren entdeckt und als bug 64892 abgelegt. (Ich frage mich, warum niemand die Zeit finden könnte, um das zu beheben?)

Verwandte Themen