此代碼有效,無需指定建構式:
struct Foo
{
int a;
int b;
};
//...
int a1, b1;
Foo foo = {a1, b1};
如果我將 Foo 設為模板,則它不起作用。
template<typename T1, typename T2>
struct Foo
{
T1 a;
T2 b;
};
//...
int a1, b1;
Foo foo = {a1, b1};
它說扣除失敗/提供了 2 個引數,而預期有 1 個。如果我添加一個這樣的建構式,Foo(T1, T2){}它就可以作業。我想,這種結構默認情況下只適用于結構。我怎么了?
編輯:我正在使用 Clang,這似乎不支持它。MSVC 和 GCC 都使用 c 20 編譯器標志編譯它。
uj5u.com熱心網友回復:
由于 C 20 聚合具有隱式生成的推導指南,因此類模板引數推導也適用于聚合。
int a1, b1;
Foo foo = {a1, b1}; // works since C 20; T1 and T2 are deduced as int
在C 20之前,需要添加自定義推導,eg
template<typename T1, typename T2>
struct Foo
{
T1 a;
T2 b;
};
template<class T1, class T2> Foo(T1 a, T2 b) -> Foo<T1, T2>;
Clang還不支持聚合的類模板引數推導。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/415739.html
標籤:
上一篇:如何將模板引數限制為僅浮點型別
