[英]Why is const template parameter not a universal/forwarding reference
我正在閱讀有關通用引用/轉發引用的信息, 此鏈接表示:
這里param
是一個通用參考:
template<typename T>
void f(T&& param);
但這里param
不是通用引用,它是一個右值引用:
template<typename T>
void f(const T&& param);
通用引用的定義如下:
如果變量或參數被聲明為具有某種推導類型 T 的類型 T&&,則該變量或參數是通用引用。
我讀過 T 是一個推導類型,因為Template argument deduction 。
為什么第二種情況不是通用參考? 由於某種原因, const T&& param
的存在是否不遵循模板參數推導? 如果是這樣,為什么?
前言:官方術語是轉發引用。
那么為什么第二種情況不是通用參考呢?
因為它是對 const 的引用。 對 const 的引用不是轉發引用。
為什么?
轉發引用的全部意義在於,當右值作為參數給出時,該參數將被推導出為對非常量右值的引用,這允許在轉發時移動此類參數(同時允許左值不從)。 您不能從對 const 的引用移動,因為移動構造函數的參數將是對非常量的右值引用,不能綁定到對 const 的引用。
語言律師的回答是:因為標准是這樣說的:
[temp.deduct.call] 轉發引用是對cv-unqualified模板參數的右值引用,它不代表類模板的模板參數...
因為這會違背目的。
即使它是一個轉發引用,在傳遞右值時你也會得到 const 右值引用。移動語義需要一個非常量引用,以便可以修改源對象,因為重點是竊取 about-to 的內部狀態-expire 對象而不是做一個潛在的昂貴的副本。
無論價值類別如何,您都會一直進行復制。 所以在這種情況下“轉發”沒有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.