この関数を考えてみましょう:
template <typename T>
T foo(const T& var = T()) {
return var;
}
この呼び出しは明らかに安全です:
foo<std::string>()
それらはありますか?
foo<int>()
foo<bool>()
...
はい、まったく問題ありません。フォームの式は、T()型のオブジェクトを作成し、Tそれを値で初期化します。intorを値で初期化することboolは、それらをゼロで初期化することと同じです。つまり、パラメータのvar値は 0 になります。
式
T()、 whereTは非配列完全オブジェクト型の単純型指定子または型名指定子[...] は、指定された型の prvalue を作成します。その値は、オブジェクトの値の初期化 (8.5) によって生成されます。タイプのT
値の初期化は次のように定義されます。
タイプのオブジェクトを値で初期化するとは、次のことを
T意味します。
if
Tは (おそらく cv 修飾された) クラス型 [...]
T(おそらく cv 修飾された) 非共用体クラス型の場合 [... ]が配列型の場合
T[...]それ以外の場合、オブジェクトはゼロで初期化されます。
ゼロ初期化は次のように定義されます。
型のオブジェクトまたは参照をゼロで初期化するとは、次のことを
T意味します。
が
Tスカラー型 (3.9) の場合、オブジェクトは値0(ゼロ) に設定され、整数定数式として取得され、 に変換されTます。[...]
によって作成された一時オブジェクトは参照にT()バインドされ、constその有効期間が延長されます。
完全式の終わりとは異なる時点で一時変数が破棄される状況が 2 つあります。[...] 2 番目のコンテキストは、参照が一時的にバインドされている場合です。