通过引用传递 r 值?

Som*_*mer 6 c++ language-lawyer c++20

我经常编写通过非常量引用获取参数的函数,但缺点是我无法传递 r 值。

我的一位同事向我展示了这段据说可以解决问题的代码:

#include <iostream>

// example function
int f(int& x) {
    x += 5;
    return x;
}

// is this undefined behaviour?
auto& to_l_value(auto&& x) {
    return x;
}

int main () {
    auto y = f(to_l_value(5)); // usage example
    std::cout << y; // 10
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是由于悬空引用而导致的未定义行为吗?(5之前被摧毁了f在调用

临时的什么时候被销毁?

Jar*_*d42 8

当完整表达式完成时,临时对象将被销毁(除了一些例外)。所以你在这里很好。

有关生命周期的更多详细信息:

所有临时对象都将在评估(词法上)包含它们创建点的完整表达式的最后一步被销毁,如果创建了多个临时对象,则它们将按照与创建顺序相反的顺序被销毁。即使该评估最终引发异常也是如此。

但有两个例外:

  • 临时对象的生命周期可以通过绑定到 const 左值引用或右值引用 (C++11 起) 来延长,有关详细信息,请参阅引用初始化。
  • 在评估用于初始化数组元素的默认构造函数或复制构造函数的默认参数时创建的临时对象的生命周期在数组的下一个元素开始初始化之前结束。