我正在使用 C 中的模板,想知道我們如何正確(值)初始化類模板中的非靜態資料成員。例如,請考慮以下代碼段:
template<typename T>
class MyVector
{
T x; // x has undefined value for a built in type
};
現在我知道資料成員對于本地/塊范圍內的內置型別x具有垃圾值,除非顯式初始化。
所以我想對資料成員進行值初始化。如果我將上面的代碼修改為:
template<typename T>
class MyVector
{
T x(); // now x becomes a member function
};
從上面修改后的代碼片段中可以看出,x現在是一個成員函式。我如何值初始化x型別的資料成員T?
uj5u.com熱心網友回復:
您可以使用默認成員初始值設定項(C 11 起),它僅支持等號或大括號初始值設定項,但不支持括號。
template<typename T>
class MyVector
{
T x{};
// or
T x = T();
};
或者提供一個帶有成員初始值設定項串列的用戶定義的建構式。
template<typename T>
class MyVector
{
T x;
MyVector() : x() {}
};
uj5u.com熱心網友回復:
根據您使用的 C 版本,有不同的方法可以做您想做的事。這將在下面更詳細地解釋:
C 11
template<typename T>
class MyVector
{
T x{};
};
預 C 11
template<typename T>
class MyVector
{
T x;
MyVector(): x()
{
}
};
C 11
從 C 11 開始,您還可以撰寫(使用建構式初始值設定項串列):
template<typename T>
class MyVector
{
T x;
MyVector(): x{}
{
}
};
C 11
請注意,如果復制初始化的建構式是顯式的,則此版本將不起作用,因為沒有強制復制 elison。
#include <iostream>
using namespace std;
struct Name
{
explicit Name(const Name&)
{
}
Name() = default;
};
template<typename T>
class MyVector
{
public:
T x = T();
};
int main()
{
cout<<"Hello World";
MyVector<int> p; // works with C 11,C 17 etc
MyVector<Name> n; //error with C 11 and C 14
return 0;
}
但上述版本將適用于 C 17,因為 C 17 中有強制復制 elison。
#include <iostream>
using namespace std;
struct Name
{
explicit Name(const Name&)
{
}
Name() = default;
};
template<typename T>
class MyVector
{
public:
T x = T();
};
int main()
{
cout<<"Hello World";
MyVector<int> p; // works with C 11,C 17 etc
MyVector<Name> n; //works with C 17 due to mandatory copy elison
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385114.html
