関数が参照を返しても返される型が明示的に参照として呼び出されていない場合、lambdaから作成されたstd :: functionsに問題があります。 std :: functionは警告なしでうまく作成されているようですが、それを呼び出すと、参照が予想されるときに値が返され、物事が爆発します。ここでは非常に不自然な例だ:std :: functionを使った奇妙な返り動作(lambda(C++)から作成)
#include <iostream>
#include <vector>
#include <functional>
int main(){
std::vector<int> v;
v.push_back(123);
std::function<const std::vector<int>&(const std::vector<int>&)> callback =
[](const std::vector<int> &in){return in;};
std::cout << callback(v).at(0) << std::endl;
return 0;
}
これは、ラムダが明示的にそれが正常に動作しますconst参照を返すように変更された場合しかし、ゴミを出力します。私はコンパイラがラムダがヒント無しに戻り値であると考えていることを理解することができます(私はこの問題に当初直面していましたが、ラムダはconst参照を返す関数から結果を直接返していました。 const参照リターンのラムダは推論可能ですが、明らかにそうではありません。)私が驚いているのは、コンパイラはstd ::関数をラムダから返される型が一致しないように構築できるということです。この動作は期待されていますか?このミスマッチを起こすことができる標準で何かが見当たりませんか?私はg ++(GCC)4.8.2でこれを見ていますが、他の何ものでも試していません。
ありがとうございます!
@Nawazなぜあなたはあなたの答えを削除しましたか? – Barry
Clang ++ 3.7.0でもガベージが表示されます(g ++はセグメンテーション違反につながります)。 – jhnnslschnr
@jhnnslschnrチェックしていただきありがとうございます - なぜ投稿された回答が削除されたのかわかりませんが(正しいと思われますが)、本質的には値を返すラムダが参照戻り値の型を持つstd ::関数に幸せに結びつくことでした。ラムダはコピーを返し、関数は一時コピーへの参照を返します。これは、参照の戻り値の型を持つ関数からローカル変数を返すことと同じだと思います。 – Kevin