2016-06-08 33 views
15

我有以下的typedef:爲什麼添加對右值引用的引用不是錯誤?

using int_ref = int&&; 

爲什麼下面的代碼不會產生錯誤(或打印false)?

std::cout << is_same< int_ref, int_ref&& >::value; // prints 1 

我預計int_ref&&被擴大到int&& &&這顯然是不可能的。我錯過了什麼嗎?

回答

28

這是由於reference collapsing rules

基本上,雖然你不能寫一個參照參考自己,在某些情況下(類型定義,模板參數,decltypes),您可以添加創建參考引用類型,其中倒塌如下:

A& & -> A& 
A& && -> A& 
A&& & -> A& 
A&& && -> A&& 

在你的情況下,int_refint&&,所以int&& &&變成int&&


的相關標準報價:

(N3337) [dcl.ref]/6:如果一個typedef(7.1.3),一個類型模板參數(14.3.1)或decltype說明符(7.1 .6.2)表示類型TR 是對T類型的引用,嘗試創建類型「左值引用cvTR」創建類型 「左值參考T「,而嘗試創建類型」右值參考cvTR「創建類型TR

+0

啊,很酷!你有沒有機會參考C++規範,在這裏提到? – tobspr

+2

@tobspr好的,添加 – TartanLlama

+1

@tobspr如果你曾經聽過有人談論過「通用引用」或「轉發引用」,那就是引用崩潰的簡單解釋,許多人在實踐中發現更直觀和有用。你找到了一些不起作用的角落案例之一。 – Ixrec

相關問題