为什么可以使用右值引用作为成员而没有生命周期问题?
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};
的末尾被破坏,因此程序具有未定义的行为。