この関数を考えてみましょう:
template <typename T>
T foo(const T& var = T()) {
return var;
}
この呼び出しは明らかに安全です:
foo<std::string>()
それらはありますか?
foo<int>()
foo<bool>()
...
はい、まったく問題ありません。フォームの式は、T()
型のオブジェクトを作成し、T
それを値で初期化します。int
orを値で初期化すること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 番目のコンテキストは、参照が一時的にバインドされている場合です。