【发布时间】:2018-02-12 12:42:54
【问题描述】:
我在看video,Nicolai 说这个例子中自动丢失了移动语义:
template<typename Callable, typename... Args>
auto call(Callable&& op, Args&&... args) {
return std::invoke(std::forward<Callable>(op), std::forward<Args>(args)...);
}
我想知道:
为什么会这样?
guaranteed RVO 是否启动 这个例子?如果是这样,担心搬家有什么意义?
【问题讨论】:
-
我认为这段代码的问题是,如果 callable 返回一个引用
call将返回一个从该引用构造的对象。所以使用auto来声明一个返回类型将使它“不那么完美”向前。视频建议改用decltype(auto)。