我搜索了"functional programming in c++"书籍,只得到了4个不相关的结果。
我正在阅读Ivan Čukić的Functional Programming in C++,在第118页有一句话我不确定是否理解正确。这一部分讲述成员函数的右值引用和左值引用重载,而这句话是指使用&&
引用类型限定符的第二个重载:
第二个重载将被调用,用于你可以从中借用数据的对象--临时对象和其他右值引用。
我的疑问如下:
- 斜体部分首先让我感到困惑,因为如果不是临时对象,那还能是什么呢?但可能这只是因为我还没有完全理解xvalues的概念;
- 粗体的单词真的让我感到困惑,因为只有删除这个单词后,这句话才对我有意义。
实际上,我的理解是,如果我说“rvalue引用”,我指的是函数参数(因此它有一个名称;例如,在自由函数
f
的声明中,a
)声明为rvalue引用到实际参数,或者我已经声明的变量(因此它有一个名称;例如:rr
)作为另一个变量的rvalue引用;(值得一提的是,引用的实体必须是rvalues,否则引用将无法绑定)。无论哪种情况,由于它有一个名称,调用成员函数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();
}
std::move(x)
是指向x
的右值引用类型,其值类别是右值。我是正确的吗? - Enlicodecltype(fn())
明确返回一个引用类型,声明为T& fn()
。 - Zuodian Hudecltype
并不能真正给出表达式的类型!decltype
通过使用引用类型来结合类型和值类别信息:prvalues不带引用,lvalues带有&,xvalues带有&&。我的早期评论直接基于标准。decltype
“撒谎”的事实也来自标准。 - HTNWstd::move(x)
的类型是int
,类别是 xvalue。表达式x
本身的类型是int
,类别是 lvalue。std::move
将类别从 lvalue 转换为 xvalue,而不改变类型。"rvalue" 是 "prvalue 或 xvalue" 的简写;说std::move(x)
是一个 rvalue 是正确的,但更具体地说它是一个 xvalue。从 lvalue 到 xvalue 的转换以及从 xvalue 到 lvalue 的转换都是零成本的,这促使我们说它们实际上是同一种东西,只是意图不同。 - HTNW