问题标签 [lvalue-to-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 回答
45 浏览

c++ - 非平凡的右值和左值示例

我不确定一些右值/左值非平凡的例子。

和表达式低于左值还是右值std::vector<int>({1,2,3})[0]std::vector<int>()

该代码没有实际用途,但令我惊讶的是该代码是有效的。看起来它们都是左值。或不?

进一步的例子...

下面的std::vector<int>()表达式是一个右值。正确的?以及如何表达std::vector<int>({1,2,3})[0]
向量对象 fromstd::vector<int>()和 int 值 from...[0]都是临时值。正确的?

0 投票
2 回答
60 浏览

c++ - 为什么不能在函数之间直接传递右值引用参数?

我的代码如下:

当我编译上面显示的代码时,我得到了一些编译错误: 在此处输入图像描述

似乎strinB::send函数已更改为左值。然后我改变了 的实现B::send,比如:

一切都很顺利,但是这个程序的输出让我更加困惑。输出如下: 在此处输入图像描述

为什么参数 str 是一个右值引用,但我不能A::sendByRvalue直接将它传递给函数std::move

0 投票
1 回答
52 浏览

c++ - 使用 *this 从右值进行的预期无效初始化

在 C++ 中,不可能将 r 值参数绑定到非constl 值引用。但我注意到,当我调用 r-value 对象时,返回*this它的方法会以某种方式编译。

示例:不经意间,这段代码将无法编译

但是添加一个简单的方法X使其可编译:

为什么它有效?是不是说调用后右foo值对象就变成左值对象了?使用这种结构是否安全?有没有其他方法可以在不创建新方法(类似X.this)的情况下达到类似的效果?

0 投票
0 回答
54 浏览

c++ - std::string 的右值和左值

我运行如图所示的代码,我对为什么 a+b 是右值感到困惑。据我所知,右值应该只有一个数据或地址,在这种情况下 std::string 应该是一个左值,不是吗?

输出

0 投票
1 回答
421 浏览

c++ - 结构化绑定是否应从 C++20 中的函数作为右值返回?

考虑一个 C++20 程序,其中函数foo中有一个结构化绑定auto [y]。该函数返回y,它被转换为类型的对象AA可以从 const 引用或 rvalue-reference 构造。

应根据 C++20 语言标准选择哪一个构造函数?

Clang 选择A(const int &)和 GCC 选择A(int &&),演示:https ://gcc.godbolt.org/z/5q779vE6T

其中一个编译器是否不支持这方面的标准?

0 投票
1 回答
55 浏览

c++ - 右值来自哪里?

我学习了引用和值类别,因为后者在一些 C++ 错误中被提及。

我有一个函数,referenceToDouble它接受对双精度的引用。通过观看有关值类别的视频left,我相信right以下是对 double 的左值引用

main我制作变量ab类型double时,我没有收到错误。下面的代码显示ab类型float,这给了我一个错误。

当我将a和的数据类型切换b为 时float,出现此错误。

我的问题是:

  • 右值来自哪里?

  • 是否有一个临时变量包含 从中转换的double值?这是暂时的吗?afloatrvalue

  • 或者错误是指55.5which 是文字,因此是右值?

  • 这里不涉及返回类型吗?我认为这不是因为这是按值返回而不是按引用返回。

我尝试阅读有类似错误的这个问题的答案,但我无法消除我的疑虑。我也认为我知道解决方案(使用double)是什么,但我试图了解引擎盖下发生了什么。

0 投票
4 回答
119 浏览

c - 为什么我们在将变量传递给scanf时需要地址运算符(&符号,&),但在分配给它时不需要?

使用scanf函数时,不能简单地指定变量名。相反,我们必须在变量名称前加上一个 & 符号,例如int a; printf("enter your value"); scanf("%d", &a);.

我检查了在线资源寻找原因。他们中的大多数人会说:

  1. 我们需要修改该变量中的值。我们添加&以表示内存位置,以便可以更改该位置的值。

  2. 函数的参数scanf()具有指针类型:需要给它一个内存地址,以便它可以更改变量的值。

我是编码新手,所以我对此有点困惑。如果我们需要地址来修改内存包含的内容,为什么我们&在分配给变量时不使用,例如int a; a = 5;?在此示例中,我们还修改了该值。为什么我们不这样写:int a; &a = 5;