[英]Why universal reference have to use template for the member function instead of class?
例如:這不是通用參考:
template<typename T>
class C {
public:
void gogo(T&& c);
};
但這是:
template<typename A>
class C {
public:
template<typename B>
void gogo(B&& par);
}
在第二個片段中, B&& par
不一定是通用參考。 只有在調用時讓編譯器推斷B
時,它才被認為是通用的:
C<float> c;
c.gogo(42); // T is deduced as int, `par` acts as an universal reference.
c.gogo<int>(42); // T is fixed, `par` is a regular rvalue reference.
由於在第一個片段中T
在調用時總是固定的,因此引用永遠不會是通用的。
C<int> c; // Must specify T here, there's no way for it to be deduced.
c.gogo(42); // T is fixed, `par` is a regular rvalue reference.
這是因為根據定義,通用或轉發引用是對函數調用本身的模板參數的右值引用。
從函數調用中推導出模板參數 [temp.deduct.call]
轉發引用是對不代表類模板的模板參數的 cv 非限定模板參數的右值引用
該標准明確指出模板參數不是類模板參數的事實。 你實際上可以自己弄清楚:
template<typename T>
class C {
public:
void gogo(T&& c);
};
這里, goto()
不是模板函數。 這里的模板是類。 一旦模板類被某個特定類型實例化, gogo()
只是一個普通的非模板類方法,它接受一個已定義的特定類型的參數,一個對類模板參數是任何類型的右值引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.