0

この関数を考えてみましょう:

template <typename T>
T foo(const T& var = T()) {
  return var;
}

この呼び出しは明らかに安全です:

foo<std::string>()

それらはありますか?

foo<int>()
foo<bool>()
...
4

1 に答える 1

2

はい、まったく問題ありません。フォームの式は、T()型のオブジェクトを作成し、Tそれを値で初期化します。intorを値で初期化することboolは、それらをゼロで初期化することと同じです。つまり、パラメータのvar値は 0 になります。

T()、 whereTは非配列完全オブジェクト型の単純型指定子または型名指定子[...] は、指定された型の prvalue を作成します。その値は、オブジェクトの値の初期化 (8.5) によって生成されます。タイプのT

値の初期化は次のように定義されます。

タイプのオブジェクトを値で初期化するとは、次のことをT意味します。

  • ifTは (おそらく cv 修飾された) クラス型 [...]

  • T(おそらく cv 修飾された) 非共用体クラス型の場合 [... ]

  • が配列型の場合T[...]

  • それ以外の場合、オブジェクトはゼロで初期化されます。

ゼロ初期化は次のように定義されます。

型のオブジェクトまたは参照をゼロで初期化するとは、次のことをT意味します。

  • Tスカラー型 (3.9) の場合、オブジェクトは値0(ゼロ) に設定され、整数定数式として取得され、 に変換されTます。

  • [...]

によって作成された一時オブジェクトは参照にT()バインドされ、constその有効期間が延長されます。

完全式の終わりとは異なる時点で一時変数が破棄される状況が 2 つあります。[...] 2 番目のコンテキストは、参照が一時的にバインドされている場合です。

于 2013-04-08T12:09:18.553 に答える