问题标签 [rvalue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2940 浏览

c++ - 类、右值和右值引用

左值是绑定到内存的确定区域的值,而右值是一个表达式值,其存在是暂时的,不一定指向内存的确定区域。每当在需要右值的位置使用左值时,编译器都会执行左值到右值的转换,然后继续求值。

http://www.eetimes.com/discussion/programming-pointers/4023341/Lvalues-and-Rvalues

每当我们构造一个临时(匿名)类对象或从函数返回一个临时类对象时,虽然该对象是临时的,但它是可寻址的。但是,该对象仍然是有效的右值。这意味着对象是 a) 可寻址右值或 b) 当编译器期望使用左值时,它正在从左值隐式转换为右值。

例如:

我们还知道,函数返回的临时对象(在以下情况下a)是左值,如下代码段:

产生以下输出:

int conversion ctor

lvalue copy ctor

表示ret_a使用实参A(5)调用函数调用转换构造函数A::A(int),该构造函数构造函数的形式参数a,值为 5。

当函数完成执行时,它会构造一个临时A对象,使用a它作为参数,调用A::A(A&). 但是,如果我们A::A(A&)要从重载构造函数列表中删除,返回的临时对象仍然会匹配右值引用构造函数A::A(A&&)

这是我不太理解的:对象如何同时a匹配右值引用和左值引用?很明显,这A::A(A&)是比A::A(A&&)(因此a必须是左值)更好的匹配。但是,由于不能将右值引用初始化为左值,鉴于形式参数a是左值,它不应该能够匹配对A::A(A&&). 如果编译器正在进行左值到右值的转换,那将是微不足道的。A::A(A&)事实上,从 'A' 到 'A&' 的转换也是微不足道的,两个函数应该具有相同的隐式转换序列等级,因此,当两者A::A(A&&)都在重载函数中时,编译器不应该能够推断出最佳匹配函数候选集。

此外,问题(我之前问过的)是:

给定对象如何同时匹配右值引用和左值引用?

0 投票
1 回答
175 浏览

c++ - 不同类型的*值

可能重复:
什么是右值、左值、xvalues、glvalues 和 prvalues?

右值,左值,非右值,非左值有什么区别?

这样的*值有多少种类型?我的意思是我也听说过xvalues。

需要好好理解这一点。这些与临时变量和 lambdas 有什么关系?

对不起,如果我听起来重复、困惑、矛盾和多余。

0 投票
2 回答
1243 浏览

c++ - 为什么这个右值调用模棱两可?

为什么这个右值调用模棱两可?我可以拥有 AA 和 AA& 并且编译器会知道使用AA&. 但是当我添加第三个选项时,我得到了一个错误。显然 AA&& 是一个更好的重载,然后其他像 int 的 int 比 long 更好。为什么这是模棱两可的?有没有办法可以保留所有 3 个重载并明确我想要哪个?(类型转换(AA&&)不会这样做)。

0 投票
2 回答
574 浏览

c++ - 如何在 C++ 2011 中禁止调用右值对象的 const 成员函数?

以下代码

可能会导致崩溃,因为原始向量已经在那里被破坏。在引入右值引用后的 C++ 2011 (c++0x) 中,如果向量参数是右值,则可以使用已删除的函数声明来完全禁止调用at

看起来不错,但是下面的代码仍然会导致崩溃

因为operator [] (size_type) const仍然允许调用右值对象的成员函数。有什么办法可以禁止这种电话吗?

使固定:

上面的例子不是我在实际项目中所做的。我只是想知道 C++ 2011 是否支持任何符合条件的成员函数

使固定:

这很棒,但我认为 C++ 标准在这个特性上走得太远了。无论如何,我在 clang++ 2.9 上编译了以下代码

非常感谢!

0 投票
5 回答
1354 浏览

c++ - 什么是 decltype(0 + 0)?

(由答案提示。)

给定 N3290,§7.1.6.2p4,其中列表项未编号,但为方便起见在此处编号:

decltype(e) 表示的类型定义如下:

  1. 如果 e 是不带括号的 id 表达式或不带括号的类成员访问 (5.2.5),则 decltype(e) 是由 e 命名的实体的类型。如果没有这样的实体,或者如果 e 命名了一组重载函数,则程序是非良构的;
  2. 否则,如果 e 是一个 xvalue,则 decltype(e) 是 T&&,其中 T 是 e 的类型;
  3. 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;
  4. 否则,decltype(e) 是 e 的类型。

decltype(0 + 0) 指定的类型是什么?

第 1 项不适用,第 2 项可能,但如果不适用,则第 3 项不适用,结果为 4。那么,什么是 xvalue,0 + 0 是 xvalue 吗?

§3.10p1:

一个 xvalue(一个“eXpiring”值)也指一个对象,通常接近其生命周期的末尾(例如,它的资源可能会被移动)。xvalue 是某些涉及右值引用的表达式的结果 (8.3.2)。

我在 §8.3.2 中看不到任何有用的东西,但我知道“0 + 0”不涉及任何右值引用。文字 0 是一个纯右值,它是“一个不是 xvalue 的右值”(§3.10p1)。我相信“0 + 0”也是一个prvalue。如果这是真的,“decltype(0 + 0)”将是 int(不是 int&&)。

我在解释中是否遗漏了什么?这段代码格式正确吗?

该代码在 GCC 4.7.0 20110427 和 Clang 2.9(主干 126116)上编译。例如,如果 decltype 指定了一个 int&& 类型,那么它的格式就不是很好。

0 投票
2 回答
280 浏览

c++ - 哪些右值有名字?

0 投票
4 回答
8863 浏览

c++ - 需要左值作为增量操作数错误

有什么问题++(-i)?请说清楚。

0 投票
2 回答
3768 浏览

c++ - C++0x const RValue reference as function parameter

I am trying to understand why someone would write a function that takes a const rvalue reference.

In the code example below what purpose is the const rvalue reference function (returning "3"). And why does overload resolution preference the const Rvalue above the const LValue reference function (returning "2").

0 投票
2 回答
820 浏览

c++11 - 文字和右值引用

aint是在test被调用时创建的,还是在 C++ 文字中默认为int类型?

0 投票
3 回答
642 浏览

d - D 中的 const ref 和 rvalue

代码

编译错误

http://ideone.com/O8wFc

问题:

  1. 为什么const ref不能绑定到右值?可以吗?
  2. 我需要返回ref CustomReal或返回const ref CustomRealopBinary()解决这个问题吗?可以吗?
  3. 返回对在堆栈上创建的本地对象的引用是否正确? ref CustomReal Create() { return CustomReal(0.0); }