1

次のコードはSegmentation Faulty = anotherFunctor()行に a を生成します。私が理解している限り、これは、作成globalFunctor時に変数が存在しないために発生しますanotherFunctorstd::function<int(int)>しかし、に置き換えるとなぜ機能するのGlobalFunctorですか? どうすれば修正できますか?

#include <functional>

struct GlobalFunctor
{
    int operator()() const { return 42; }
};
extern GlobalFunctor globalFunctor;

struct AnotherFunctor
{
    AnotherFunctor() : g_(globalFunctor) {}

    int operator()() const { return g_(); }

    const std::function<int()>& g_;
} anotherFunctor;

GlobalFunctor globalFunctor;

int main()
{
    AnotherFunctor af;
    int x = af();
    int y = anotherFunctor();
    int z = x + y;
    return 0;
}

編集:clang代わりにこれをコンパイルしようとしましたがgcc、警告が表示されますbinding reference member 'g_' to a temporary valueが、これをコンパイルするとクラッシュします。キャストstd::functionは一時的な参照を作成しますか?

4

1 に答える 1

1

Atは 型であるため、g_(globalFunctor)globalFunctor変換する必要があります。したがって、一時が生成され、これが定数参照にバインドされます。コードは を実行していると考えることができます。ただし、この一時的なものはコンストラクターの最後までしか存続しません。C++ には、メンバー初期化子リスト内の一時的なものはコンストラクターの最後までしか存続しないという特別な規則があるためです。これにより、ぶら下がり参照が残ります。std::functionGlobalFunctorg_(std::function<int()>(globalFunctor))

変換が含まれていないため、に置き換えるstd::function<int(int)>とコードが機能します。GlobalFunctorしたがって、一時オブジェクトは生成されず、参照はグローバル オブジェクトを直接参照します。

std::function参照を使用せずに内部的に保存するか、グローバルstd::functionを作成してそれへの参照を持つ必要があります。

于 2013-01-07T20:52:55.413 に答える