次の模範的な関数があると仮定します。
template <typename Fn> auto call(Fn fn) -> decltype(fn()) {
return fn();
}
この関数の重要な点は、その戻りタイプが、推測できるテンプレートパラメーターに依存することです。したがって、最終的には、戻り型は関数の呼び出し方法によって異なります。
現在、テストクラスもあります。
struct X {
int u;
auto test() -> decltype(call([this]() -> double {this->u = 5; return 7.4;})) {
return call([this]() -> double {this->u = 5; return 7.4;});
}
};
ご覧のとおり、をX::test
呼び出しcall
て、同じ戻り値を返します。この場合、リターンタイプは自明にとして与えられますdouble
が、少しの間、何が行われるのかわからずcall
、ラムダがより複雑なリターンタイプを持っていると仮定しましょう。
これをコンパイルしようとすると、コンパイラは文句を言います。これはthis
、トップレベルで使用しているためです(式を許可するスコープではありません)。
error: lambda-expression in unevaluated context
error: invalid use of ‘this’ at top level
ただし、の戻り型を正しく取得するには、渡すラムダのキャプチャを使用する必要があります。ラムダを残したまま、これを回避する方法を提案しますか?call
call
注:もちろん、ラムダをoperator()
何らかのヘルパータイプに移動することもできます。これは、this
ポインターのコピーを使用してインスタンス化しますが、その定型文は避けたいと思います。