簡體   English   中英

Class 模板類型的模板參數推導,模板類型本身就是模板的參數

[英]Class template argument deduction for template type which is itself an argument for a template

在另一個模板類型聲明中使用默認 arguments 的模板類型是否支持 class 模板參數推導? 以下代碼不能同時使用 Clang/GCC 主干編譯,它在定義y的行上失敗:

#include <optional>

template <class T = char>
struct C {};

int main() {
    C x;
    std::optional<C> y;
}

https://godbolt.org/z/SgxY90

修改代碼以讀取std::optional<C<>> y解決了這個問題,但我有點驚訝這是需要的。 這是編譯器問題,還是已知的語言限制?

編譯器必須驗證傳遞給模板的內容是否與預期的模板參數匹配。 現在考慮我用你的例子寫這個,你看不到foo

foo<C> f;

它是 CTAD 的一個實例,還是我傳遞了模板本身? 因為已經可以將模板作為 arguments 傳遞給其他模板。

template< template<typename> class T > struct foo {};

在該上下文中允許C的使用依賴於上下文。 相反,模板名稱在聲明變量時沒有其他用途。 寫的時候沒有歧義...

C c;

...這可能意味着 CTAD以外的其他內容,因此此處允許。 但是當模板名稱用作模板參數時,上下文很重要。 C++ 已經有很多上下文相關的結構,所以添加更多通常是個壞主意。

暫無
暫無

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

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