(我搜索了c++“c++中的函数式编程”一书,这本书只给出了4个无关的结果。)
我正在从C++阅读IvanČukić中的函数式编程,在第118页有一个句子,我不确定我是否理解。该节涉及成员函数的rvalue和lvalue重载,句子如下,其中第二个重载是使用&&引用类型限定符的重载:
第二个重载将被调用到对象上,您可以从这些对象替换数据--临时对象和其他rvalue references。
我怀疑的是:
下面的代码是为了支持我的理解。
事实上,我的理解是,如果我说rvalue引用,我指的是一个函数参数(因此它有一个名称;例如:在空闲函数f's声明中的f)声明为rvalue引用的实际参数,或者我声明的变量(因此它有一个名称;例如:rr)作为对另一个变量的rvalue引用;(fwiw,两个引用-ed实体都必须是rvalue,否则引用不会绑定)。在这两种情况下,由于它有一个名称,调用其上的成员函数f,将导致调用lvalue重载,不是吗?
那么,书中是否有错误的措辞,还是我遗漏了什么?
#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();
}发布于 2020-05-08 16:35:24
粗体的这个词真的让我感到困惑,因为只有当我删除这个词的时候,这个句子对我来说才有意义。
我同意。更准确地说,这句话应该是
第二个重载将被调用到对象上,您可以从这些对象替换数据-- rvalue(prvalue或xvalue)。
Rvalue引用用于类型,rvalue用于价值范畴,它们是独立的事物。在这种情况下,将调用哪些重载取决于值类别,即要调用的对象是lvalue或rvalue,与其类型无关。
斜体字的部分首先让我感到困惑,因为如果不是暂时的,它还能是什么呢?但也许这仅仅是因为我还没有对x值有一个确切的理解;
是的,x值也是rvalue。给定int x = 0;,std::move(x)是一个xvalue,但它不是临时的。
https://stackoverflow.com/questions/61683603
复制相似问题