本地对象是否保证比临时参数更长久?(C++ 11)

mfr*_*kli 2 c++ object-lifetime c++11

如果我有一个函数将对象Bar作为参数的设置,则将该对象传递给本地类Foo,并在其析构函数中Foo使用Bar如下:

class Foo {
    public:
        Foo(const Bar& bar) : bar_(bar) {}
        ~Foo() {
            bar_.DoSomething();
        }
    private:
        const Bar& bar_;
};

void example_fn(const Bar& input_bar) {
    Foo local_foo(input_bar);
    // ... do stuff.
    // When foo goes out of scope, its destructor is called, using input_bar.
}
Run Code Online (Sandbox Code Playgroud)

如果example_fn用临时调用Bar input_bar,是否Foo local_foo保证局部变量在临时参数之前被销毁?换句话说,参数是否保证比局部变量更长?

Whi*_*TiM 7

是否Foo local_foo保证在临时参数之前销毁的局部变量?

是的,保证以相反的构造顺序销毁具有自动存储持续时间(即本地人)的对象.函数参数始终在块作用域内的本地之前构造(以未指定的顺序).请参阅C++中的Object Destruction

[class.temporary/5]

5: ......此外,绑定到引用的临时对象的破坏应考虑具有静态,线程或自动存储持续时间的对象的破坏顺序([basic.stc.static],[basic.stc.thread] ,[basic.stc.auto]); 也就是说,如果obj1一个对象具有与临时存储持续时间相同的存储持续时间并且在临时创建之前创建,则临时应在销毁之前obj1销毁; 如果obj2一个对象具有与临时相同的存储持续时间并且在创建临时后创建临时应该在销毁后obj2销毁....