2017-08-06 73 views
18

我不明白,爲什麼下面的代碼編譯的GCC 8.0:爲什麼這個右值引用綁定到一個左值?

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

foor申報類型爲int&&,等的foo返回類型也int&&。但r本身是一個左值,並且左值不能綁定到右值引用。

我錯過了什麼嗎?

+0

轉載[gcc8](https://wandbox.org/permlink/4CSGrHnZ26nGL8QK),似乎gcc8推斷返回類型爲'int&'。 – songyuanyao

+0

@songyuanyao他們聲稱代碼編譯,所以這不會是repro。 –

+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])。

幸運的是,兩年前已發現並提交爲bug 64892。 (我想知道爲什麼沒有人能找到解決這個問題的時間?)

相關問題