问题标签 [lvalue]

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 投票
7 回答
11363 浏览

c++ - 为什么占用临时地址是非法的?

我知道下面写的代码是非法的

原因是我们不允许获取临时对象的地址。但我的问题是为什么?

让我们考虑以下代码

这里接受的答案提到

“通常编译器将临时和副本视为两个对象,它们位于完全相同的内存位置并避免复制。”

根据该声明,可以得出结论,临时存在于某个内存位置(因此其地址可能已被占用)并且编译器决定通过在存在临时的相同位置创建就地对象来消除临时对象.

这是否与不能获取临时地址的事实相矛盾?

我还想知道如何实现返回值优化。有人可以提供与 RVO 实施相关的链接或文章吗?

0 投票
1 回答
310 浏览

c - gcc 对什么是左值感到困惑?

gcc 在赋值错误中给了我无效的左值:

将代码更改为以下使其消失:

但据我所知,两者在 C 中都是 100% 等效的。gcc 在非左值表达式中使用前者没有问题。这只是gcc中的一个错误吗?我已经用几个版本对其进行了测试,并得到了相同的结果。

0 投票
2 回答
2622 浏览

c++ - C++0x:右值引用与非常量左值

在 C++03 中编程时,我们不能将未命名的临时对象T()传递给函数void foo(T&);。通常的解决方案是给临时命名,然后像这样传递它:

现在,C++0x 出现了——现在有了右值引用,定义为的函数void foo(T&&)将允许我传递一个临时值。这让我想到了我的问题:既然一个接受右值引用的函数既可以接受右值引用(未命名的临时对象)也可以接受左值引用(命名的非常量引用),是否有任何理由在函数参数中再使用左值引用?我们不应该总是使用右值作为函数参数吗?

当然,采用左值引用的函数会阻止调用者传递临时值,但我不确定这是否是一个有用的限制。

0 投票
5 回答
3168 浏览

c - 取消引用的指针是有效的左值吗?

假设定义:

为什么 *pa 在这里是有效的左值:

不应该 *p 评估存储在 &i 的 int 的值,即。10,因此产生“不是左值”错误?

0 投票
3 回答
2183 浏览

c++ - 为什么预增量运算符在 C 中给出右值?

在 C++ 中,预增量运算符给出左值,因为返回的是递增的对象本身,而不是副本。但在 C 中,它给出了右值。为什么?

0 投票
5 回答
13734 浏览

c++ - 表达式必须是可修改的左值指针到字符参数

这是整个代码。编译后出现以下错误:

错误 LNK2019:函数 _wmain 中引用的未解析的外部符号“void __cdecl CandyBarFunc(struct CandyBar &,char const *,double,int)”(?CandyBarFunc@@YAXAAUCandyBar@@PBDNH@Z)

致命错误 LNK1120:1 个未解决的外部问题

0 投票
2 回答
1167 浏览

c++ - 关于左值到右值的转换,什么时候需要?

我在网上看了很多,似乎很多人提到了以下规则(但我在标准中找不到),

加法运算符 +(和所有其他二元运算符)要求两个操作数都是右值,结果是右值。等等..

我检查了 C++ 标准,它明确指出(第 3.10/2 条),

每当一个泛右值出现在预期纯右值的上下文中时,该泛左值就会被转换为一个纯右值

(第 5/9 条),

每当一个泛左值表达式作为操作数的操作数出现时,该操作数需要一个纯右值,左值到右值 (4.1)、数组到指针 (4.2) 或函数到指针 (4.3) 标准转换是应用于将表达式转换为纯右值。

它使用操作数“期望”一个纯右值的术语。但是,当我研究加法运算符、乘法运算符等时,它只提到结果是纯右值,但没有说明操作数“预期”是什么。

二元运算符是否真的期望操作数是纯右值在以下情况下会有所不同,

如果b期望是prvalue,这里会有一个lvalue到rvalue的转换,然后会执行prvalue + prvalue,返回一个prvalue,结果prvalue赋值给一个lvalue a。

但是,如果 b 不需要是纯右值,它将是左值 + 纯右值,结果是纯右值。

我真的很想知道标准在哪里明确或隐含地提到了不同运营商的规则?我检查了所有操作符部分,并且只有少数标准明确提到操作数和结果应该是左值还是右值。对于大多数运算符,该标准仅提及结果而不提及操作数要求。

谢谢。


顺便说一句,我在标准 5.19 中发现关于常量表达式的内容可能非常“隐含”地暗示二元运算符需要对操作数进行左值到右值的转换。更详细的可以参考我之前的问题,

混合使用 constexpr 和 const?

条件表达式是一个常量表达式,除非它涉及以下之一作为潜在评估的子表达式 (3.2)。

...

— 左值到右值的转换 (4.1),除非它应用于

———— 一个整数或枚举类型的左值,它引用一个非易失性的 const 对象,前面有初始化,用常量表达式初始化

谢谢阅读。

0 投票
3 回答
4696 浏览

gcc - 编译时出现 GCC 错误:带有函数指针的“左值需要作为赋值的左操作数”

我有一个 C 代码,它在数组中记录一个过程地址

GCC 显示“错误:需要左值作为赋值的左操作数”。我怎样才能解决这个问题?出于我的目的,我不能直接调用 AnyFunction()。

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 有什么关系?

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