hereから読むと、このC++ 11コードは私には奇妙に思えます:
template <typename Builder>
auto
makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )
{
auto val = builder.makeObject();
// do stuff with val
return val;
}
いくつか質問があります:
1) decltype(builder.makeObject()) は、実際の呼び出しが実行される前に、makeObject 関数をもう 1 回呼び出しますか?
2) そうではなく、コンパイル時にすべてがわかっている場合 (拡張マクロのようなものです)、なぜ次の構文が有効でなく、新しい戻り値の構文が必要なのですか?
//WRONG
template <typename Builder>
decltype( builder.makeObject() )
makeAndProcessObject (const Builder& builder)
{
auto val = builder.makeObject();
// do stuff with val
return val;
}
[おまけの質問 - 回答に +1 を与える] 3)この質問で、コードがコンパイルされない理由を尋ねたところ、メンバー関数 makeObject の「const」指定子が見つからないという回答がありました。答えはわかりましたが、const が必要な理由はわかりません。
次の宣言に与えるもの
template <typename Builder>
auto
makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )
const Builder& オブジェクト参照に const makeObject または非 const makeObject がある場合は? decltype(builder.makeObject()) 部分は、関数の戻り値の型が何であるかを調べるだけで、関数がパラメーターとして渡されたオブジェクトを変更するかどうかを気にする必要はありません!