[英]Partial specialization of type parameter in template class with type & template template parameters
[英]Alias template, partial specialization and the invalid parameter type void
考慮以下代碼:
template<typename F>
struct S;
template<typename Ret, typename... Args>
struct S<Ret(Args...)> { };
template<typename... Args>
using Alias = S<void(Args...)>;
int main() {
S<void(int)> s;
Alias<int> alias;
}
正如預期的那樣,它運行良好,並且涉及S
的行和涉及Alias
的行都在Alias
定義了相同的類型S<void(int)>
。
現在,請考慮以下更改:
int main() {
S<void(void)> s; // this line compiles
Alias<void> alias; // this line does not
}
我希望它可以編譯,原因與上述原因相似。
不用說,由於涉及Alias
的行,它無法編譯,相反,我得到了錯誤:
代替“使用Alias = S [with Args = {void}]的模板”
[...]
錯誤:參數類型無效'void'
問題很簡單:我在這里錯過了什么?
在[dcl.fct]中,重點是:
由不相關類型為
void
的單個未命名參數組成的參數列表等效於空參數列表。 除這種特殊情況外,參數不得具有cvvoid
類型。
在這種情況下, Args...
是一個依賴類型包,因此那里不允許void
。 在[temp.deduct]的注釋中重復了這個想法:
[注意:類型推斷可能由於以下原因而失敗:
— [...]
—嘗試創建一個函數類型,其中參數的類型為void
,或者返回類型為函數類型或數組類型。
— [...]
—尾注]
需要注意的是S<void(void)>
編譯自void(void)
非依賴性和等同於void()
這樣Ret(Args...)
永遠不會推導出有void
的參數列表-它推導與Args...
空。
至少有一個簡單的解決方法,您可以只編寫Alias<>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.