"无法完美转发 "T&&"输入的参数?-6ren"> "无法完美转发 "T&&"输入的参数?-auto(x)表达式被添加到语言中。一个理性的原因是我们无法以此完善前向衰减。 template constexpr decay_t decay_copy(T&& v) noexcept( i-6ren">
gpt4 book ai didi

c++ - 根据 "auto(x)"论文(wg21.link/p0849),为什么 "return std::forward"无法完美转发 "T&&"输入的参数?

转载 作者:行者123 更新时间:2023-12-03 07:53:44 25 4
gpt4 key购买 nike

auto(x)表达式被添加到语言中。一个理性的原因是我们无法以此完善前向衰减。

template<class T>
constexpr decay_t<T> decay_copy(T&& v) noexcept(
is_nothrow_convertible_v<T, decay_t<T>>) {
return std::forward<T>(v);
}

decay_copy只是无法避免复制,根据论文https://wg21.link/p0849 .

An obvious issue is that decay_copy(x.front()) copies x.front() even if x.front() is a prvalue, in other words, a copy.


std::forward<T>应该完美转发使用通用/转发引用声明的输入参数吗?

最佳答案

return std::forward<T>(v); 的问题是返回的表达式是 xvalue,而不是纯右值。这不受强制复制省略的约束(自 C++17 起)。

是什么让auto(x)特别的是,如果x已经是纯右值,那么 auto(x)将简单地引用相同的纯右值。相比之下,decay_copy(prvalue)将采用右值引用作为参数,包含 return xvalue;语句,这是 v 的有保证的复制/移动.

这显然不是完美转发,因为完美转发意味着我们采用表达式及其值类别并以零开销移动它们,例如调用移动/复制构造函数。

decay_copy 怎么样? 隐式移动

有趣的是,decay_copy功能可以简化:

template<class T>
constexpr decay_t<T> decay_copy(T&& v) noexcept(...) {
return v;
}

The [unqualified-id] expression is an xvalue if it is move-eligible (see below).
[...]
An implicitly movable entity is a variable of automatic storage duration that is either a non-volatile object or an rvalue reference to a non-volatile object type.In the following contexts, an id-expression is move-eligible:

  • If the id-expression (possibly parenthesized) is the operand of a return [...]

-[expr.prim.id.unqual]

无论我们是直接返回引用还是作为 std::forward 的结果返回引用,这不受复制/移动省略的影响,并且没有办法做到这一点。

NRVO 注释

有时,即使没有纯右值,从函数返回也可以完全消除复制/移动。然而,这在这里是不可能的:

This elision of copy/move operations, called copy elision, is permitted in the following circumstances:

  • (1.1) in a return statement in a function with a class return type, when the expression is the name of a non-volatile object with automatic storage duration (other than a function parameter [...])

-[class.copy.elision]/1.1

在上面的函数中,return v;也永远没有资格进行命名返回值优化 (NRVO),因为 v不是一个对象,而是一个引用。即使它是一个对象,它也是一个函数参数,仍然不合格。

关于c++ - 根据 "auto(x)"论文(wg21.link/p0849),为什么 "return std::forward<T>"无法完美转发 "T&&"输入的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76544710/

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