簡體   English   中英

為什么 const 模板參數不是通用/轉發參考

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM