立即作为参数传递的对象的生命周期是多少?

What is the lifetime of an object immediately passed as a parameter?

我有一些代码如下所示:

struct fooclass {
    char data[32];
}

fooclass makefoo() {
    fooclass res;
    // for example:
    memset(res.data, 0, sizeof(res.data));
    res.data[0] = 43;
    return res;
}

struct do_stuff {
    const fooclass& obj;
    do_stuff(const fooclass& obj_in) : obj(obj_in) { }

    void operate() { /* do things with obj; */ }
}

bool put_it_to_work(struct do_stuff& f) {
    f.operate();
    f.operate();
    return true;
}

bool call_it_all() {
    do_stuff local(makefoo());
    return put_it_to_work(local);
}

使用 gcc,代码运行良好。使用 MSVC2012,local.obj 已损坏。

问题是:makefoo返回的fooclass持续多长时间?应该一直到 call_it_all 结束,还是一直到 do_stuff local(makefoo()) 行结束,而我只是运气好?我希望能参考该标准。

这是你的问题:

struct do_stuff {
    const fooclass& obj;

obj 是一个引用,不是一个合适的对象,因此不会对 makefoo() 的结果进行复制。 obj 引用的真实对象在local 对象构造完成时被销毁,具体是当makefoo() returns 的匿名临时变量被销毁时。

我认为你很幸运它能在 gcc 下工作。也许 obj 引用 的对象 被销毁了,只有它的数据留在 RAM 中,程序似乎可以正常工作。也许 MSVC 是 "erased" obj 提到的 RAM,因此尝试使用它会很快失败。