C+11はタイプバックの構文の使用例を返します。


C++11の新しい標準で増加したautは、変数の種類を自動的に推定するだけでなく、decltypeと結合して関数の戻り値を表します。これらの新しい特性はより簡潔で、より現代的なコードを作成することができます。
汎用プログラミングでは、パラメータの演算によって戻り値を求めるタイプが必要かもしれない。
この例を見てみましょう。

#include<iostream>
using namespace std;


template <typename R,typename T, typename U>
R add(T t,U u)
{
  return t+u;
}

int main()
{
  int a=1;
  float b=2.0;
  auto c = add<decltype(a+b)>(a,b);
}

私たちはa+bタイプが何かに関心がありません。decltype(a+b)を通じて直接に戻り値タイプを得るだけでいいです。しかし、上記のように使用するのは非常に不便です。外部は実際にはパラメータ間の計算方法が分かりません。add関数だけが戻り値をどうやって導き出すべきかを知っています。
私たちは直接関数の定義上でdecltypeで戻り値を得ることができますか?例えばこのように:

template <typename T, typename U>
decltype(t+u) add(T t,U u)      //    ,t,u   
{
  return t+u;
}
運転後、コンパイラはエラーを提示します。decltype(t+u)の中でtとuはこのスコープでまだ宣言されていません。
t、uはパラメータリストにありますが、C++の戻り値は前置文法ですので、戻り値が定義されているときはパラメータ変数はまだ存在しません。
この例について、実行可能な書き方は以下の通りです。

template <typename T, typename U>
decltype(T()+U()) add(T t,U u)    
{
  return t+u;
}
T、Uを考慮すると、無参画関数のクラスがないかもしれません。正しい書き方はこうです。

template <typename T, typename U>
decltype((*(T*)0)+(*(U*)0)) add(T t,U u)    
{
  return t+u;
}
decltypeを使用することに成功したが、戻り値の導出は書き方が難しすぎて、decltypeの戻り値タイプの導出に使用する難易度が大幅に増加し、コードの読み取り可能性が低下した。
したがって、C++11には戻りタイプの後付け文法が追加され、decltypeとautを結合して戻り値タイプの導出が行われる。
戻るタイプの後置文法は、autとdecltypeを組み合わせて使用します。上のadd関数は新しい文法を使って書いてもいいです。

template <typename T, typename U>
auto add(T t,U u) ->decltype(t+u)    
{
  return t+u;
}
この文法をさらに説明するために、もう一つの例を見ます。

#include<iostream>
using namespace std;


int& foo(int& i);
float foo(float& f);

template <typename T>
auto func(T& val) -> decltype(foo(val))
{
  return foo(val);
}

この例では、decltypeを用いて戻り値を結合した後置文法は、foo(val)にあり得る戻り値タイプを容易に導出し、funcに適用した。
戻り値タイプの後付け文法は、関数の戻り値タイプがパラメータに依存することを解決するために、戻り値タイプを決定するのが難しい問題です。このような文法があると、戻り値のタイプに対する導出が明確に記述されます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。