簡體   English   中英

為什么這個嵌套模板推導會失敗?

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

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