15
我有以下的typedef:爲什麼添加對右值引用的引用不是錯誤?
using int_ref = int&&;
爲什麼下面的代碼不會產生錯誤(或打印false
)?
std::cout << is_same< int_ref, int_ref&& >::value; // prints 1
我預計int_ref&&
被擴大到int&& &&
這顯然是不可能的。我錯過了什麼嗎?
我有以下的typedef:爲什麼添加對右值引用的引用不是錯誤?
using int_ref = int&&;
爲什麼下面的代碼不會產生錯誤(或打印false
)?
std::cout << is_same< int_ref, int_ref&& >::value; // prints 1
我預計int_ref&&
被擴大到int&& &&
這顯然是不可能的。我錯過了什麼嗎?
這是由於reference collapsing rules。
基本上,雖然你不能寫一個參照參考自己,在某些情況下(類型定義,模板參數,decltypes),您可以添加創建參考引用類型,其中倒塌如下:
A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&
在你的情況下,int_ref
是int&&
,所以int&& &&
變成int&&
。
的相關標準報價:
(N3337) [dcl.ref]/6:
如果一個typedef(7.1.3),一個類型模板參數(14.3.1)或decltype說明符(7.1 .6.2)表示類型TR
是對T
類型的引用,嘗試創建類型「左值引用cvTR
」創建類型 「左值參考T
「,而嘗試創建類型」右值參考cvTR
「創建類型TR
。
啊,很酷!你有沒有機會參考C++規範,在這裏提到? – tobspr
@tobspr好的,添加 – TartanLlama
@tobspr如果你曾經聽過有人談論過「通用引用」或「轉發引用」,那就是引用崩潰的簡單解釋,許多人在實踐中發現更直觀和有用。你找到了一些不起作用的角落案例之一。 – Ixrec