gpt4 book ai didi

c++ - 书中 "rvalue"和 "rvalue reference"的混淆

转载 作者:行者123 更新时间:2023-12-01 14:52:47 25 4
gpt4 key购买 nike

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

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

The second overload will be called on objects from which you're allowed to stead the data -- temporary objects and other rvalue references.

我的疑惑是:

  • 斜体 的部分首先让我感到困惑,因为 如果不是临时的,它还能是什么?,但也许这只是因为我还没有对 xvalues 是什么有了深刻的理解;
  • 粗体这个词真的让我很困惑,因为只有当我删除那个词时,这个句子对我来说才有意义。

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

确实,我的理解是,如果我说右值引用,我是在谈论一个函数参数(所以它有一个名称;例如:a函数 f 的声明)声明为对实际参数的右值引用,或者我声明的变量(因此它有一个名称;示例:rr)作为右值引用另一个变量; (顺便说一下,两个被引用的ed 实体都必须是右值,否则引用不会绑定(bind))。在任何一种情况下,因为它有一个名称,调用成员函数 f 会导致调用左值重载,不是吗?

那么这本书中是否有措辞错误或者我遗漏了什么?

#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();
}

最佳答案

the word in bold really puzzles me, in that the sentence seems meaningful to me only if I remove that word.

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

第二个重载将在允许您从中替换数据的对象上调用——右值(右值或 x 值)。

右值引用用于类型,右值用于value categories ,它们是独立的东西。在这种情况下,将调用哪个重载取决于值类别,即要调用的对象是左值还是右值,与其类型无关。

the part in italic puzzles me in the first place, as in what else could it be if not a temporary?, but maybe this is just because I still haven't got a firm understanding of what xvalues are;

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

关于c++ - 书中 "rvalue"和 "rvalue reference"的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61683603/

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