18
我不明白,爲什麼下面的代碼編譯的GCC 8.0:爲什麼這個右值引用綁定到一個左值?
decltype(auto) foo(int&& r) {
return r;
}
在foo
的r
申報類型爲int&&
,等的foo
返回類型也int&&
。但r
本身是一個左值,並且左值不能綁定到右值引用。
我錯過了什麼嗎?
我不明白,爲什麼下面的代碼編譯的GCC 8.0:爲什麼這個右值引用綁定到一個左值?
decltype(auto) foo(int&& r) {
return r;
}
在foo
的r
申報類型爲int&&
,等的foo
返回類型也int&&
。但r
本身是一個左值,並且左值不能綁定到右值引用。
我錯過了什麼嗎?
根據[dcl.spec.auto]/5,推導返回類型,就好像return
語句的操作數是decltype
的操作數。並且[dcl.type.simple]/(4.2)明確指出,由於操作數不加括號,實體的類型是由decltype
產生的類型,即int&&
。實際上,r
是一個左值([expr.prim.id.unqual])。
幸運的是,兩年前已發現並提交爲bug 64892。 (我想知道爲什麼沒有人能找到解決這個問題的時間?)
轉載[gcc8](https://wandbox.org/permlink/4CSGrHnZ26nGL8QK),似乎gcc8推斷返回類型爲'int&'。 – songyuanyao
@songyuanyao他們聲稱代碼編譯,所以這不會是repro。 –
@BaummitAugen固定代碼用[gcc8](https://wandbox.org/permlink/7mUFIa2VVAwgprEM)編譯,但不是[clang6](https://wandbox.org/permlink/3lpIoyciSWUisYh7)。 – songyuanyao