簡體   English   中英

為什么通用引用必須對成員函數使用模板而不是類?

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

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