【问题标题】:Do rvalues decay silently?右值会默默衰减吗?
【发布时间】:2021-07-16 16:36:58
【问题描述】:
std::vector foo( std::vector && rval )
{
    return std::move( rval );
}

如果一个函数需要一个右值引用但得到了其他东西——例如const 引用或临时引用或与std::move(vec) 不同的任何东西,它会默默地复制而不是抛出错误甚至警告吗?

【问题讨论】:

  • 临时可以绑定到右值引用。无需复制。左值引用,无论是否为 const,都不能。试图通过一个是可诊断的约束违规。
  • "如果一个函数需要一个右值引用但得到了其他东西" 那是不可能的。如果函数接受 X,那么它得到 X。有时,需要将 Y 强制转换为 X,但函数获取 X。你不能将 const& 传递给一个函数,它采用 && 而不进行显式转换,在这种情况下,您是负责这些操作的可行性的人。临时对象自然绑定到右值引用。

标签: c++ c++20 rvalue-reference


【解决方案1】:

自己试试吧:

#include <iostream>

struct S {
    S() { }
    S(const S& other) { std::cout << "copy ctor" << std::endl; }
    S(S&& other) { std::cout << "move ctor" << std::endl; }
}; 

int foo( S && rval )
{
    return 1;
}

int main()
{
    S s1;
    foo (s1);
}

复制 S'es 并不是无声的。那么,当您尝试编译它时会发生什么?

这个happens(天箭):

<source>: In function 'int main()':
<source>:17:10: error: cannot bind rvalue reference of type 'S&&' to lvalue of type 'S'
   17 |     foo (s1);
      |          ^~
<source>:9:15: note:   initializing argument 1 of 'int foo(S&&)'
    9 | int foo( S && rval )
      |          ~~~~~^~~~

所以,您的问题的答案是“否”。

【讨论】:

    【解决方案2】:

    如果期望 rvalue ref 的函数获得 const ref,则编译器会出错。如果期望 rvalue ref 的函数得到 const 则编译器会再次报错。

    如果您还定义了一个函数,该函数期望 const rvalue ref 和 const ref 与 std::move 被发送 (std::move(const &)),那么它可以工作。但是,定义一个期望 const rvalue ref 的函数是不合理的,因为这意味着从 const 只读中窃取。

    将 temp 值发送给期望 rvalue ref 的函数是可能且合理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多