![](/img/trans.png)
[英]Is passing of a function pointer through a class type in non-type template parameter allowed in C++20?
[英]Is placeholder for the deduced class type of non-type template parameter a C++20 feature?
隨着將 class 類型的非類型模板參數添加到 C++20 標准 ( P0732R2 ) 中,引入了使用非類型模板參數推導的 class 類型的占位符聲明非類型模板參數的可能性[dcl. type.class.deduct]§2 :
推導的 class 類型的占位符也可用於新表達式的新類型標識或類型標識中的類型說明符序列中,作為顯式類型轉換中的簡單類型說明符(功能符號),或作為模板參數的參數聲明中的類型說明符。
加粗的是標准中增加了P0732R2 。 這允許這樣的代碼:
template <class T>
struct x{
constexpr x(T){}
};
template <x v>
struct y {};
y <1> b;
我曾考慮在新代碼中使用此功能,但有 3 個原因讓我認為該功能實際上是打算從標准中刪除的:
它沒有很好地集成在標准中,例如,對於 function 模板的部分排序的未更改標准措辭使得不可能部分特化類似於y
的 class 模板,因為模板參數v
的合成參數必須具有唯一的發明類型(在 class 模板特化的部分排序期間使用的綜合參數);
參數內占位符的這種語法看起來像概念 TS 的“短概念語法”。 在標准中加入 P0732R2 后,此語法已更改為“形容詞語法” concept-name auto
;
在標准討論中,似乎並非所有委員會成員都知道此功能。
非類型模板參數的推導 class 類型的占位符是 C++20 功能嗎?
非類型模板參數的推導 class 類型的占位符是 C++20 功能嗎?
是的。 [temp.param]/6對此非常清楚:
非類型模板參數應具有以下類型之一(可能是 cv 限定的):
- 結構類型(見下文),
- 包含占位符類型 ([dcl.spec.auto]) 的類型,或
- 推導的 class 類型的占位符([dcl.type.class.deduct])。
至於你的顧慮。
它沒有很好地集成到標准中,例如,對於 function 模板的部分排序的標准措辭沒有改變,因此無法對 class 模板進行部分特化 [...]
是的,語言添加經常不完整並導致語言問題。 一個更緊迫的問題是對哪些類型可以用作非類型模板參數的限制,一個禁止std::string
、 std::tuple
和std::optional
的限制和時刻。 這些將在適當的時候得到解決。
參數內占位符的這種語法看起來像 concept-TS 的“短概念語法”
這正是 CTAD 語法的樣子。
在標准討論中,似乎並非所有委員會成員都知道此功能。
所以?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.