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