7

decltypeC++ 11で学習しています。

autoとの機能がdecltype重複しているようで、 が必要な理由がわかりませんdecltype

wikiによると、その主な用途は汎用プログラミングであり、テンプレート パラメーターに依存する型を表現することはしばしば困難であるか、不可能ですらあります。

ジェネリック プログラミングでは、auto型を表現するのが難しい場合に使用できます。

template <typename T>
void MakeAnObject (const T& builder)
{
    auto val = builder.MakeObject();
    // do stuff with val
}

が必要な理由がわかりませんdecltype

できdecltypeないことをautoできるか?

4

3 に答える 3

20

auto「変数の型は初期化子から推測される」ことを意味します。

decltype任意のコンテキストで型を参照します。

を使用できない例を次に示しますauto

template <typename T, typename U, typename V>
void madd(const T &t, const U &u, const V &v, decltype(t * u + v) &res)
{
  res = t * u + v;
}

パラメータ宣言にはイニシャライザがありません(存在することはできません)ので、そこでは使用できませんauto

問題は、用途の 99% がdecltypeテンプレートにあるということです。そこには同等の機能はありません。テンプレート以外のコードでautoは、通常、 を使用します。

于 2013-09-16T15:37:32.677 に答える
2

を使用して宣言された変数を取得することは便利ですがauto、実際に式の型を知る必要がある場合 (たとえば、テンプレート化された関数の戻り値の型を生成する場合auto) では十分ではありません: 値に名前を付けるだけでなく、型を取得するため、たとえば、型を変更するため。何かを落とすことができるとしたら、それはauto. ただし、 の使用は、decltype()より多くの語彙を使用する傾向があります。つまり、適切autoなショートカットです。

于 2013-09-16T15:38:41.103 に答える