私はついにc++ 11について読み始めましたが、なぜ末尾の戻り値の型が必要なのか理解できません。
問題を強調するために使用される次の例に出くわしました。
template<class Lhs, class Rhs>
decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs) {return lhs + rhs;}
decltype(lhs+rhs)
識別子lhs
とrhs
は解析フェーズの後でのみ有効であるため、この例は正しくありません。
私の質問は、decltype
型解決のタイミングについてだと思います。私が間違っていなければ、キーワードdecltype
はコンパイル時に式の型を決定するために使用されます。
decltype
すべての解析が完了した後に型解決を実行することのマイナス面は見当たりません(上記の例では問題なく機能します)。これは問題を解決するためのより簡単な方法だったと思います...
代わりに、C++11 標準は末尾の戻り値の型を提供します。
template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}
末尾の戻り型の他の使用法が見当たらないので、何かが欠けていることは間違いありません。私の推論のどこに欠陥がありますか?
decltype
完全な関数本体を解析した後に型解決を行うことも同様に機能するため、trailing-return-types は非常に複雑なソリューションのように思えます。