2017-08-06 4 views
18

fooこのrvalue参照が左辺値にバインドされるのはなぜですか?次のコードは、GCC 8.0でコンパイルし、なぜ私は理解していない

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

を、rの宣言型がint&&あり、そのためfooの戻り値の型もint&&です。しかしr自体は左辺値であり、左辺値は右辺値参照にバインドできません。

何か不足していますか?

+0

[gcc8](https://wandbox.org/permlink/4CSGrHnZ26nGL8QK)で再現された場合、gcc8は戻り値の型が 'int&'であると推測します。 – songyuanyao

+0

@songyuanyao彼らはコードをコンパイルすると主張します。 –

+1

@BaummitAugen固定コードは[gcc8](https://wandbox.org/permlink/7mUFIa2VVAwgprEM)でコンパイルされますが、[clang6](https://wandbox.org/permlink/3lpIoyciSWUisYh7)ではコンパイルされません。 – songyuanyao

答えて

14

[dcl.spec.auto]/5によれば、戻り値の型は、returnステートメントのオペランドがdecltypeのオペランドであるかのように導かれます。 [dcl.type.simple]/(4.2)は、オペランドがカッコで囲まれていないため、エンティティのタイプはdecltypeによって生成されたタイプ、つまりint&&であることを明確に述べています。実際、rは左辺値([expr.prim.id.unqual])です。

幸いにも、これは2年前に発見され、bug 64892として提出されました。 (なぜ誰もこれを修正する時間を見つけることができないのだろうか?)

関連する問題