首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >书中"rvalue“与"rvalue reference”的混淆

书中"rvalue“与"rvalue reference”的混淆
EN

Stack Overflow用户
提问于 2020-05-08 16:27:57
回答 1查看 86关注 0票数 3

(我搜索了c++“c++中的函数式编程”一书,这本书只给出了4个无关的结果。)

我正在从C++阅读IvanČukić中的函数式编程,在第118页有一个句子,我不确定我是否理解。该节涉及成员函数的rvalue和lvalue重载,句子如下,其中第二个重载是使用&&引用类型限定符的重载:

第二个重载将被调用到对象上,您可以从这些对象替换数据--临时对象和其他rvalue references

我怀疑的是:

  • 斜体字的部分首先让我感到困惑,因为如果不是暂时的,它还能是什么呢?但也许这仅仅是因为我还没有对x值有一个确切的理解;
  • 粗体的这个词真的让我感到困惑,因为只有当我删除这个词的时候,这个句子对我来说才有意义。

下面的代码是为了支持我的理解。

事实上,我的理解是,如果我说rvalue引用,我指的是一个函数参数(因此它有一个名称;例如:在空闲函数f's声明中的f)声明为rvalue引用的实际参数,或者我声明的变量(因此它有一个名称;例如:rr)作为对另一个变量的rvalue引用;(fwiw,两个引用-ed实体都必须是rvalue,否则引用不会绑定)。在这两种情况下,由于它有一个名称,调用其上的成员函数f,将导致调用lvalue重载,不是吗?

那么,书中是否有错误的措辞,还是我遗漏了什么?

代码语言:javascript
复制
#include <iostream>

struct A {
  void f() &  { std::cout << "lvalue\n"; } // const & in the book, but it shouldn't make any difference
  void f() && { std::cout << "rvalue\n"; }
};

void f(A&& a) { a.f(); } // a is an lvalue (of type rvalue ref to)

int main() {
  A a;          // "normal" object
  A&& rr = A{}; // rvalue reference to a temporary (with life extended)

  a.f();
  A{}.f(); // only here I expect the rvalue overload to be called, and this is the case
  f(A{});
  rr.f();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-08 16:35:24

粗体的这个词真的让我感到困惑,因为只有当我删除这个词的时候,这个句子对我来说才有意义。

我同意。更准确地说,这句话应该是

第二个重载将被调用到对象上,您可以从这些对象替换数据-- rvalue(prvalue或xvalue)。

Rvalue引用用于类型,rvalue用于价值范畴,它们是独立的事物。在这种情况下,将调用哪些重载取决于值类别,即要调用的对象是lvalue或rvalue,与其类型无关。

斜体字的部分首先让我感到困惑,因为如果不是暂时的,它还能是什么呢?但也许这仅仅是因为我还没有对x值有一个确切的理解;

是的,x值也是rvalue。给定int x = 0;std::move(x)是一个xvalue,但它不是临时的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61683603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档