我有一個帶有模板引數默認值的類模板:
template<typename T = int>
class DefaultType : private std::array<T, 5> { };
并且由于 c 17 這可以像普通類一樣實體化
DefaultType obj; // equivalent to `DefaultType<>`
如果我將此型別用作另一個模板的引數,則無法完成相同的操作:
// error: type/value mismatch at argument 1 in template parameter list for ...
class Foo : public std::vector<DefaultType> { };
然而,上面的代碼片段確實使用DefaultType<>.
(天馬行空)
這是什么原因?扣除指南會有幫助嗎?NTTP 呢?
uj5u.com熱心網友回復:
這:
DefaultType obj;
使用自 C 17 起可用且僅在某些背景關系中可用的CTAD(類模板引數推導):
- 任何指定變數和變數模板初始化的宣告
- 新運算式
- 函式式轉換運算式
- 非型別模板引數的型別:
要DefaultType在其他背景關系中使用默認引數進行實體化,您仍然需要撰寫DefaultType<>.
我想只在某些背景關系中使用 CTAD 的原因是那些是您總是想要實體化而不是模板的背景關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/383312.html
上一篇:C 中[]的可變運算子多載
下一篇:不同數量的模板變數
