现代C ++,对xValue的理解
modern c++, understanding of xvalue
现代C++只添加了一个新类型"xvalue"?函数返回的右引用是 xvalue,这是定义的,就像函数参数中的右引用一样,只能绑定到正确的值? 这些理解正确吗? 与本主题相关的问题和答案从学习者的角度处理此问题。在这里,我试图从设计师的角度来了解这个话题。例如,int b =3;int&& x = std::move(b(;std::move 的返回值是一个 xValue,它可以绑定到 rreference,这是设计器设置的规则。(合理且可用(。设计器还可以设置一个规则,即 xvalue 需要绑定左引用,即使这不是一个好的规则。
请注意这里的术语。 函数参数或函数返回类型可能具有/是右值引用类型,但不是 x值,因为术语"xvalue"仅适用于表达式。
每个表达式都是左值、x值或 prvalue。 最常见的 xvalue 类型是调用具有 rvalue 引用类型作为其返回类型的函数的表达式。 强制转换为右值引用类型的表达式也是 xvalue。 表达式也可以通过其他几种方式成为 xvalue。
右值引用是一种类型。 使用 rvalue 引用类型声明的变量可以使用 xvalue 或 prvalue 初始化,但不能使用 lvalue 初始化(除非通过用户定义的转换(。 请记住,声明为右值引用的变量的名称是左值,而不是 x值!
int n = 3; // 1
int&& r1 = static_cast<int&&>(n); // 2
int&& r2 = std::move(r1); // 3
int&& func(int&& arg); // 4
此代码示例中的表达式包括:
- 第 1 行
3
:价值 - 第 2 行
n
:左值 - 第 2 行
static_cast<int&&>(n)
:一个 xvalue - 第 3 行
r1
:左值 - 第 3 行
std::move(r1)
:一个 xvalue
第 4 行中根本没有表达式。
相关文章:
- 带过滤器的现代迭代c++集合
- 现代CMake(3.8+)-FindCUDA已弃用,非.cu文件呢
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 现代 C++ 中作为类成员的非拥有指针
- 使 std::vector 分配对齐内存的现代方法
- 具有字符串化的可变参数宏的现代/通用方法
- 将旧管道转换为现代 openGL 时出现问题
- 在现代OpenGL中,绘制GL_TRIANGLE奇怪的z轴行为的填充圆
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 现代OpenGL和GLEW Libraray的编译错误
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 以现代 CMake 方式控制包含的库中的构建选项(测试等)
- C++使用现代编译器编译的项目,但链接到过时的libstdc++
- 如何使用现代 CMake 安装捆绑的接口依赖项?
- 现代C++的libcurl和JSON问题
- 如何在现代C++中实现没有宏的系统特定功能
- 在现代C++中,侵入式容器是否仍然比非侵入式容器具有性能优势?
- 在现代 CMake 项目中存档静态依赖项
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 现代C ++,对xValue的理解