讓我們假設我們有這個小代碼:
template<typename T>
struct Test {
Test(T t) : m_t(t) {}
T m_t;
};
int main() {
Test t = 1;
}
[T=int]這段代碼很容易用for Testclass編譯。現在,如果我寫這樣的代碼:
template<typename T>
struct Test {
Test(T t) : m_t(t) {}
T m_t;
};
struct S {
Test t = 1;
};
int main() {
S s;
}
此代碼無法編譯并出現以下錯誤:
invalid use of template-name 'Test' without an argument list
我需要像Test<int> t = 1;班級成員一樣寫它才能作業。知道為什么會這樣嗎?
uj5u.com熱心網友回復:
原因
struct S {
Test t = 1;
};
不起作用是因為您實際上沒有在做Test t = 1;。類內初始化器只是一種方便的方式,可以告訴編譯器t在未提供值時使用什么值進行初始化。“實際”生成的是
struct S {
S() : t(1) {} // created by the compiler
Test t;
};
在這里你可以更容易地看到t在你呼叫建構式之前沒有用初始化器指定。
uj5u.com熱心網友回復:
您的兩個片段之間存在差異 - 首先Test t = 1宣告、定義和初始化一個新變數,而第二個片段僅宣告一個成員變數并指定如何初始化它。
默認成員初始值設定項僅在建構式的背景關系中相關,而不t在其成員初始值設定項串列中,并且很容易有多個建構式,每個建構式都t以不同的方式初始化。
以下是有效的 C ,應該t推導什么型別?
struct S {
Test t = 1;
S(){}
S(int):t(1){}
S(double):t(true){}
};
如果要支持這一點,您就會遇到使類的型別/大小/布局依賴于可能在不同翻譯單元中的建構式的定義的實作問題。因此,將無法S通過頭檔案定義包含類,例如(如果將定義移動到某些 .cpp)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534075.html
標籤:C C 17
