簡體   English   中英

別名模板,部分專業化和無效的參數類型void

[英]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的單個未命名參數組成的參數列表等效於空參數列表。 除這種特殊情況外,參數不得具有cv void類型。

在這種情況下, Args...是一個依賴類型包,因此那里不允許void 在[temp.deduct]的注釋中重復了這個想法:

[注意:類型推斷可能由於以下原因而失敗:
— [...]
—嘗試創建一個函數類型,其中參數的類型為void ,或者返回類型為函數類型或數組類型。
— [...]
—尾注]

需要注意的是S<void(void)>編譯自void(void)非依賴性和等同於void()這樣Ret(Args...)永遠不會推導出有void的參數列表-它推導與Args...空。


至少有一個簡單的解決方法,您可以只編寫Alias<>

暫無
暫無

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

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