【发布时间】:2020-07-05 01:13:08
【问题描述】:
考虑以下代码:
#include <utility>
#include <iostream>
struct object {
object(const object&) = delete;
object(object&&) = delete;
object() {std::clog << "object::object()\n";}
~object() {std::clog << "object::~object()\n";}
void operator()() const {std::clog << "object::operator()()\n";}
};
struct wrapper {
const object& reference;
void operator()() const {reference();}
};
template <class Arg>
wrapper function(Arg&& arg) {
wrapper wrap{std::forward<Arg>(arg)};
return wrap;
}
int main(int argc, char* argv[]) {
wrapper wrap = function(object{}); // Let's call that temporary object x
wrap();
return 0;
}
我真的很惊讶它会打印出来:
object::object()
object::~object()
object::operator()()
问题 1:为什么对象 x 的生命周期没有超过函数调用,即使绑定了 const 引用?
问题 2: 有什么方法可以实现 wrapper,以便在函数调用之后延长 x 的生命周期?
注意:object 的复制和移动构造函数已被显式删除,以确保它只存在一个实例。
【问题讨论】:
标签: c++ lifetime rvalue-reference temporary object-lifetime