簡體   English   中英

成員變量中的類模板參數推導

[英]Class Template Argument Deduction in member variables

擴展版在這里

我們可以創建具有默認模板參數的類模板對象,而無需鍵入尖括號:

int main()
{
    std::less a;
}

但是我們不能對成員變量這樣做:

struct S
{
    std::less a; // I want only type std::less<void> here
};

看起來第一種情況是由於CTAD而起作用,但為什么編譯器不能在第二種情況下推斷std::less<void> 也許我們不應該在那里應用 CTAD,而是提供不同的機制。

這是否被認為是標准中的錯誤? 有修復它的建議嗎?

我的用例:

我有一個提供默認參數的類模板,如下所示:

template <typename T = int>
class Foo {};

模板參數是我自己從未使用過的專家專用功能,但它適用於那些想要完全靈活性的 1% 的專家。 現在對於其他 99% 的人,我想隱藏Foo實際上是一個類模板但它不起作用的事實,因為用戶必須在將其聲明為成員變量時鍵入Foo<> ,當前的解決方案是:

template <typename T = int>
class BasicFoo {};

using Foo = BasicFoo<>;

但它使實現代碼復雜化並且一點也不優雅。

不,這不是錯誤。 這是因為可能會為同一個成員變量調用不同的構造函數(通過類的構造函數初始化列表調用),可能會產生不同的推導結果。

為了防止這種沖突的可能性,您必須為非靜態成員提供模板參數。 (靜態成員不是問題,因為會有一個構造函數調用它們)

暫無
暫無

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

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