为什么可以使用右值引用作为成员而没有生命周期问题?

Why is it possible to use rvalue references as members without lifetime problems?

有时我看到人们使用右值引用作为成员,我总是想知道这怎么可能以及它如何不会导致生命周期问题。以此为例:

class Foo
{
public:
    Foo(int&& i)
      : i_(std::move(i))
    {
    }
    void printNum()
    {
        std::cout << i_ << std::endl;
    }
private:
    int&& i_;
};


int main()
{
    Foo f{5};
    f.printNum(); // Outputs 5 every time
}

本例中整数5存在于什么范围?传递给 Foo 构造函数的右值在下一行被调用时肯定已经被破坏了,那么为什么对 printNum 的调用不保证未定义的行为?我们不是要访问不再使用的内存吗?

int 在表达式 Foo f{5}; 的末尾被破坏,因此程序具有未定义的行为。