[英]Why this nested template deduction should fail?
當我在玩模板時,我注意到一個奇怪的模板推導失敗,我想知道為什么這會在邏輯上失敗。 請檢查此代碼:
template<typename T = int>
struct A {
T v;
};
int main()
{
A k;
static_assert(std::is_same_v<decltype(k.v), int>);
}
此代碼編譯沒有任何問題,並且kv
將具有int
類型,因為它被定義為模板參數的默認類型。 現在這段代碼:
template<typename T = int>
struct A {
T v;
};
struct B {
A a;
};
int main()
{
A k;
static_assert(std::is_same_v<decltype(k.v), int>);
}
此代碼給出B
的編譯錯誤。 因為似乎在非靜態結構成員中不允許參數推導。 但我不明白為什么。 由於AAA
模板具有默認類型,因此可以輕松地將B
結構中的A
成員視為A<int>
。 我想知道為什么這不會發生。 任何想法?
這段代碼:
struct B {
A a;
};
給出一個錯誤:
invalid use of template-name 'A' without an argument list
那是因為A
是一個模板,因此編譯器要求您這樣使用它。 即使A
有默認參數也是如此; 您仍然必須使用<>
來表示您正在使用模板。
所以這段代碼:
struct B {
A<> a; // note the <>
};
會編譯得很好。
至於為什么不能為非靜態數據成員推導出模板參數,似乎和這個不起作用的原因是一樣的:
struct B {
auto a = 0; // error
}
有關詳細信息,請參閱此問題和答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.