问题标签 [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.
c++ - 右值结构的成员是右值还是左值?
返回结构的函数调用是一个右值表达式,但它的成员呢?
这段代码在我的 g++ 编译器中运行良好,但 gcc 给出错误提示“需要左值作为赋值的左操作数”:
gcc 将fun().v
其视为右值,我可以理解这一点。
但是 g++ 并不认为赋值表达式是错误的。这是否意味着 fun1().v 在 C++ 中是左值?
现在的问题是,我搜索了 C++98/03 标准,没有发现任何关于fun().v
是左值还是右值的信息。
那么,它是什么?
c++ - POD、非 POD、右值和左值
谁能解释一下右值、左值、POD 和非 POD 的细节,为什么下面标记的第一个表达式不正确而下面标记的第二个表达式可以?据我了解,int() 和 A() 都应该是右值,不是吗?
c++ - C++ 中的引用初始化
谁能向我解释为什么这两个陈述之间存在差异?
A&
它说从临时类型的类型的非常量引用的无效初始化A
为什么在const
这里很重要?
c++ - 我怎样才能使这个函数像一个左值?
为什么我不能将该函数ColPeekHeight()
用作左值?
编译器在v.ColPeekHeight()-=peek
. 我怎样才能ColPeekHeight()
得到一个左值?
function - 使用返回指针作为 LValue 的函数
为什么我不能使用将指针作为左值返回的函数?
例如这个作品
但不是这个
虽然我可以使用指针变量作为左值,但为什么不能使用返回指针作为左值的函数呢?
此外,当函数返回引用而不是指针时,它就成为有效的左值。
c++ - C++0x 右值引用——左值-右值绑定
这是C++0x 右值引用和临时的后续问题
在上一个问题中,我询问了这段代码应该如何工作:
由于隐式临时性,似乎应该调用移动重载,这发生在 GCC 而不是 MSVC(或 MSVC 的 Intellisense 中使用的 EDG 前端)。
这段代码呢?
看来,根据我之前的问题的答案,该功能g1
是合法的(并且被 GCC 4.3-4.5 接受,但不被 MSVC 接受)。但是,GCC 和 MSVC 都拒绝g2
,因为第 13.3.3.1.4/3 条禁止左值绑定到右值引用参数。我理解这背后的基本原理 - 在 N2831“解决右值引用的安全问题”中对此进行了解释。我还认为 GCC 可能正在按照该论文的作者的意图实施该条款,因为 GCC 的原始补丁是由其中一位作者(Doug Gregor)编写的。
但是,我不认为这是非常直观的。对我来说,(a) a在概念上比 aconst string &
更接近a ,并且(b)编译器可以在 中创建一个临时字符串,就好像它是这样写的:string &&
const char *
g2
实际上,有时复制构造函数被认为是隐式转换运算符。在语法上,这是由复制构造函数的形式提出的,标准甚至在第 13.3.3.1.2/4 节中特别提到了这一点,其中派生基转换的复制构造函数被赋予了比其他用户定义的更高的转换等级转换:
将类类型的表达式转换为相同的类类型被赋予精确匹配等级,而将类类型的表达式转换为该类型的基类被赋予转换等级,尽管事实上复制/移动为这些情况调用构造函数(即,用户定义的转换函数)。
(我假设这是在将派生类传递给类似 的函数时使用的,该函数void h(Base)
按值获取基类。)
动机
我提出这个问题的动机类似于如何在添加新的 c++0x 右值引用运算符重载时减少冗余代码(“如何在添加新的 c++0x 右值引用运算符重载时减少冗余代码”)中提出的问题。
如果你有一个函数接受许多可能移动的参数,并且如果可以的话会移动它们(例如工厂函数/构造函数:Object create_object(string, vector<string>, string)
或类似的),并且想要移动或复制每个参数,你很快就开始编写很多代码。
如果参数类型是可移动的,那么可以只编写一个按值接受参数的版本,如上所述。但是,如果参数是(传统)不可移动但可交换的类(如 C++03),并且您无法更改它们,那么编写右值引用重载会更有效。
因此,如果左值确实通过隐式副本绑定到右值,那么您可以只编写一个重载create_object(legacy_string &&, legacy_vector<legacy_string> &&, legacy_string &&)
,它或多或少会像提供右值/左值引用重载的所有组合一样工作——作为左值的实际参数将被复制然后绑定对于参数,作为右值的实际参数将直接绑定。
澄清/编辑:我意识到这实际上与按值接受可移动类型的参数相同,例如 C++0x std::string 和 std::vector (除了概念上调用移动构造函数的次数)。但是,对于可复制但不可移动的类型,它并不相同,包括所有具有显式定义的复制构造函数的 C++03 类。考虑这个例子:
如果g
调用f
,则x
和y
将被复制-我看不到编译器如何移动它们。如果f
改为声明为接受legacy_string &&
参数,它可以避免调用者std::move
在参数上显式调用的那些副本。我不明白这些是如何等效的。
问题
我的问题是:
- 这是对标准的有效解释吗?无论如何,这似乎不是传统的或有意的。
- 它有直觉意义吗?
- 这个想法有我没有看到的问题吗?似乎你可以在不完全预期的情况下悄悄地创建副本,但无论如何这就是 C++03 中的现状。而且,它会使一些重载当前不可行时可行,但我认为这在实践中不是问题。
- 这是一个足够显着的改进,值得为 GCC 制作一个实验性补丁吗?
r - 如何分配给R中变量值的names()属性
在 R 中,“assign('x',v)”将名称为“x”的对象设置为 v。将“x”替换为将文本函数应用于变量 x 的结果。然后“分配”显示它的价值。
不幸的是,“assign(paste('names(','x',')',sep=''),v)”失败了。所以如果'x'是一个变量x,我可以设置它的值,但我不能给它的元素命名。
可以解决这个问题吗?也许是解析评估技巧?谢谢。
c++ - C++03 中的右值
如何判断给定参数是否是 C++03 中的右值?我正在编写一些非常通用的代码,如果可能的话需要参考,否则需要构造一个新对象。我可以重载以采用按值和按引用并让右值返回调用按值函数吗?
还是我有一种非常令人作呕的感觉,这就是右值引用在 C++0x 中的原因?
编辑:
is_rvalue = !(is_reference || is_pointer) ?
objective-c - Objective C - 左值作为赋值的左操作数
我收到此代码的错误(左值需要作为赋值的左操作数):
我该如何解决?
c++ - 将临时变量作为 LValues 传递
我想使用以下成语,我认为这是非标准的。我有利用返回值优化返回向量的函数:
然后,我想使用
但some_func
不返回 LValue。上面的代码很有意义,我发现这个成语非常有用。但是,它是非标准的。VC8 只发出最高警告级别的警告,但我怀疑其他编译器可能会拒绝它。
我的问题是:是否有某种方法可以实现我想做的相同的事情(即构造一个向量,分配给另一个向量,然后销毁旧的向量),它是合规的(并且不使用赋值运算符,见下文) ?
对于我写的课程,我通常将分配实现为
它利用了复制省略,解决了我的问题。然而,对于标准类型,我真的很想使用,swap
因为我不想要临时的无用副本。
而且由于我必须使用 VC8 并生成标准 C++,我不想听到有关 C++0x 及其右值引用的信息。
编辑:最后,我想出了
当我使用左值时,因为如果 y 是临时的,编译器可以自由优化对复制构造函数的调用,并std::swap
在我有左值时继续使用。我使用的所有类都是“必需的”来实现非愚蠢版本的std::swap
.