次のコードでエラーが発生する理由を理解できますか?関数オブジェクトをラップするためにstd ::関数を使用する
class A
{
public:
float& operator()()
{
return _f;
}
private:
float _f = 1;
} a;
auto& foo()
{
std::function<float()> func = a;
return func();
}
int main()
{
std::cout << foo() << std::endl;
}
エラー:
ここerror: non-const lvalue reference to type 'float' cannot bind to a temporary of type 'float'
return func();
^~~~~~
1 error generated.
、operator()
に、私は_f
への参照を返し、その結果、私はfunc()
が一時的なものではないと思いました。 誰かが私の理解を助けてくれれば幸いです。
正しくコンパイルされていると思いますが、正しく実行されていない(たとえば、クラッシュしたり、0が表示されている)ため、UBだと恐れています。 –
私はこの質問が面白いと感じました。もしそれを 'auto&'と ''にするとうまくいきます。 'auto'と' 'とすると動作します。どちらが正しいか?私は 'auto'と' 'がローカル変数を参照渡しで返すべきではないので正しいと思います。 –
@MarsonMaoはい、私たちはローカルにバインドされた参照を返すべきではありません、ポイントは 'foo'がコピーによってここに戻るべきです。 (なぜOPが参照によって返される必要があるのかはまだ分かりません) – songyuanyao