[英]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.