簡體   English   中英

功能模板參數的類型推導

[英]Type deduction of function template parameters

我對功能模板有一些疑問。

我的計划是構建一個包裝程序,該包裝程序從用戶定義的類派生,不僅導出該類的公共函數,還導出其構造函數。 因此,我決定使用帶有1到n個參數的多個構造函數模板(我假定其工作原理與功能模板完全相同)來滿足大多數構造函數的需求。

這些將不只是簡單地調用構造函數,然后再執行其他操作,如下所示:

template <class T>
class Wrapper : public T
{
    public:
        template <class U>
        Wrapper(U &u) : T(u) { doSomething(); }

        template <class U, class V>
        Wrapper(U &u, V &v) : T(u,v) { doSomething(); }

        ...
};

我的目的是在Wrapper-Ctor中的其他位置注冊該實例,從那時起,它可以接收對T中定義的虛函數的調用。

我必須在上面的代碼中使用引用運算符,以確保我的Wrapper-Ctor對傳遞的參數(復制構造)沒有任何副作用。

令我驚訝的是,除臨時選項外,這始終有效,這就是為什么我對這種情況下編譯器推斷的類型感到困惑的原因。 為了簡化這種情況,我嘗試通過模板函數進行類似的操作:

template <class T>
void foo(T &t)
{
    int x = ""; // intentional error
}

像這樣調用函數:

std::string a; 
std::string &b = a;
foo(b);

令我驚訝的是,編譯器在其錯誤消息中表示[T = std :: string]。 我曾以為這是[T = std :: string&],這將導致傳遞引用到引用,這是無效的。

那么,為什么在這種情況下編譯器會推斷出值類型呢? 甚至有可能創建一個Wrapper-Ctor來滿足我的要求,該參數對參數沒有任何副作用,並且可以接受臨時對象嗎?

非常感謝!

看起來C ++規范明確聲明這是預期的行為。 具體來說,如果您有一個模板函數接受依賴於模板類型實參的參數P ,則如果P是引用,則使用引用的基礎類型(而不是引用類型)來確定應使用的類型。用於P (參見§14.8.2.1/ 2)。 此外,同一部分還說在此步驟中會忽略constvolatile限定詞,因此可以自動推斷出const含義。

在C ++ 03中,如果沒有為const和non-const參數的每個組合手動進行重載,就不可能提供這樣的東西。

沒有表達式具有引用類型。 因此,當自變量推導推導自變量表達類型時,由於自變量ab都具有相同的類型,因此無法區分ab

請參閱規格中的[expr] p5

如果表達式最初的類型為“對T的引用”(8.3.2,8.5.3),則在進行任何進一步分析之前,將類型調整為T。

有點晚了,但是由於我認為這還沒有完全解決...

有關模板參數的推導,請參見前面的答案。

對於臨時問題,請使參數const引用(如在Wrapper(const U&)中一樣)。

問題是,臨時屬性是右值。 該標准指出,非const引用只能綁定到左值。 因此,符合標准的編譯器將不允許您將臨時變量(rvalues)作為參數傳遞給非const參考參數。 (這與模板無關,這是一般規則)。

據我所知,所以對此持懷疑態度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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