1

下面的代码产生一个Segmentation Faulty = anotherFunctor()行了。据我了解,发生这种情况是因为创建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必须转换为 anstd::function因为它的类型是GlobalFunctor。所以产生了一个临时的,这被绑定到常量引用。您可以将代码视为做g_(std::function<int()>(globalFunctor)). 但是,这个临时变量只存在到构造函数的末尾,因为 C++ 中有一条特殊规则,即成员初始化器列表中的临时变量只存在到构造函数的末尾。这给你留下了一个悬而未决的参考。

替换为时代码有效std::function<int(int)>GlobalFunctor因为不涉及转换。因此,不会产生临时对象,并且引用直接引用全局对象。

您要么不需要使用引用并在std::function内部存储 a ,要么制作一个全局std::function并对其进行引用。

于 2013-01-07T20:52:55.413 回答