gpt4 book ai didi

c++ - 为什么自动返回类型在此示例中会丢失移动语义?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:19 24 4
gpt4 key购买 nike

我在看video Nicolai 说 auto 在这个例子中失去了移动语义:

template<typename Callable, typename... Args>
auto call(Callable&& op, Args&&... args) {
return std::invoke(std::forward<Callable>(op), std::forward<Args>(args)...);
}

我在想:

  1. 为什么会这样?

  2. guaranteed RVO 启动 这个例子?如果是这样,担心搬家有什么意义?

最佳答案

我认为 Nicolai 可以将其表述得更好一些。

当您通过auto 返回时,您的函数返回一个(将推导其类型)。如果 std::invoke 返回一个纯右值或一个 xvalue,那么 call 的结果当然会相应地构造(如果可能,通过移动)。从这个意义上说,我们不会“失去移动语义”。

但是当我们按值返回时,需要创建那个值对象。它可以通过移动创建,在某些情况下(which aren't present here)可以省略,但必须创建。有保证的复制省略不允许我们逃避创建这个对象。

如果 std::invoke 给我们返回一个 xvalue(对某物的右值引用),那将是相当浪费的。为什么要构造一个对象返回呢?

这就是为什么在一两张幻灯片之后他说我们应该按 decltype(auto) 返回。然后推导规则将保留对 std::invoke 的调用的值类别:

  1. 如果它返回一个值,我们的情况不会更糟。我们自己的 call 将返回一个值(它可以通过移动 std::invoke 的返回值来创建)。

  2. 如果 std::invoke 返回一个左值 (X&) 或一个 xvalue(X&&),将返回为是,无需通过复制或移动创建另一个对象。

关于c++ - 为什么自动返回类型在此示例中会丢失移动语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48746786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com