问题标签 [xvalue]
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++11 - std::move(a).m 是 xvalue 还是 prvalue?
假设是非引用类型 ( )m
的非静态数据成员。T
根据 cppreference,std::move(a).m
在 c++11 之前是纯右值。我想它应该是 c++11 之后的 xvalue。如果我错了,请纠正我。
但是在 c++14(visual studio、clang、gcc)中decltype(std::move(a).m)
仍然是T
(不是T&&
),这表明std::move(a).m
它仍然是一个纯右值。那么是std::move(a).m
xvalue还是prvalue?
c++ - 寿命延长、prvalues 和 xvalues
按照这个问题的公认答案右值引用是否允许悬空引用?当分配给问题中的右值引用左值时,xvalues 的生命周期似乎没有延长。但是,当我这样做时
调用返回的对象的生命周期得到make_something
延长,即使make_something().a
根据http://en.cppreference.com/w/cpp/language/value_category是一个 xvalue (xvalues 解释中的第三个项目符号列出了成员访问 I有上面作为一个xvalue,)
am,对象表达式的成员,其中 a 是右值,m 是非引用类型的非静态数据成员;
如果值类别不能确定右值的生命周期何时会延长,那该怎么办?当右值的生命周期在 C++ 中延长时,我很难理解
c++ - xvalue 上下标表达式的值类别
从 5.2.1.1 开始:
该表达式与 [...]
E1[E2]
相同(根据定义),*((E1)+(E2))
除了在数组操作数的情况下,如果该操作数是左值,则结果为左值,否则为 xvalue。
但是,使用以下代码:
GCC 和 Clang 都抱怨“右值引用不能绑定到左值 int”。
我误解了什么?据我了解S()
是右值,S().arr
是xvalue,S().arr[0]
xvalue也应该是xvalue,并且应该能够绑定到rvalue refs。
c++ - C++11:“decltype(1+2)”是否声明了 xvalue 或 prvalue?
decltype(1+2) 是否声明了 xvalue 或 prvalue?
cppreference 说,decltype(expression) 将声明: 1. T&& 如果表达式是 xvalue 2. T 如果表达式是纯右值 3. T& 如果表达式是左值
但我的问题是:如何生成一个 xvalue 的表达式?我认为返回值和临时对象应该是 xvalue,但实际上它们似乎是 xvalue,在我的实验中:
该程序编译:我可以判断
decltype(i+1) 将 (i+1) 声明为纯右值
因为如果它是一个 xvalue,那么 decltype 会得到 T&&,它不能绑定到“i”的左值变量。decltype(f()) 也给我 f() 作为prvalue也很奇怪?
所以我的问题是:如何编写一个表达式,以便 decltype(expression) 给我一个 xvalue?谢谢。
arrays - HighChart如何使用对象数组
.json 文件:
我不知道如何在 HighChart 上使用对象数据
当我使用它时
然后它什么都不起作用:所以我想知道如何使用对象数据集(key_as_string vlaue,匹配 x 值)
(doc_count vlaue,匹配 y 值)
我只能通过制作数字数组来绘制 y.value
图表选项设置
c++ - 为什么右值引用绑定到 xvalue 在我的代码中不起作用?
我试图理解 C++11 中的左值和右值。于是我写了一段测试代码:
它工作得很好,所以我插入了 std::cout 来打印结果。
int&& rr5 = baz(); std::cout << rr5;
导致运行时错误,但我不知道为什么会出错。
我认为的返回值baz()
将是 xvalue,因此它的生命周期会延长。但是当我试图访问它的值时,就会发生错误。为什么?
c++ - 5 与 std::move(5) 的行为差异
我已经阅读了关于不同值类别的所有主要问题,但仍然不清楚在这种情况下,xvalues 与 prvalues 之间的区别。
我知道,像所有glvalues一样,xvalues的动态类型可以不同于静态类型,但是例如,在文字与std::move
文字的情况下,我找不到“真正的”行为差异(可能除了那些正式基于什么的xvalue 和什么是 prvalue,比如哪个构造函数将被调用MyClass(std::move(5))
;但对于文字来说,这似乎并不重要,因为它们的值无论如何都不会被使用。
我可以从调用std::move
文字中获得什么实际的“好处”?
c++ - xvalues vs prvalues:身份属性添加了什么
对于这个问题的广泛性,我很抱歉,只是所有这些细节都是紧密相连的..
我一直试图了解具体两个值类别之间的区别 - xvalues 和 prvalues,但我仍然感到困惑。
无论如何,我试图为自己开发的“身份”概念的心智模型是,应该保证拥有它的表达式驻留在实际程序的数据存储器中。
由于这个原因,字符串文字是左值,它们保证在整个程序运行期间驻留在内存中,而数字文字是纯右值,例如可以假设存储在直接 asm 中。
这似乎同样适用std::move
于纯右值文字,即在调用时fun(1)
我们只会在被调用者框架中获得参数 lvalue,但在调用fun(std::move(1))
xvalue 时,glvalue 的“种类”必须保留在调用者框架中。
然而,这种心智模型至少不适用于临时对象,据我所知,它们应该始终在实际内存中创建(例如,如果像fun(MyClass())
使用 prvalue 参数一样调用 rvalue-ref-taking 函数)。所以我猜这个心智模型是错误的。
那么思考xvalues的“身份”属性的正确方法是什么?我已经读过,通过身份我可以比较地址,但是如果我可以比较 2 MyClass().member
s 的地址(根据 cppreference 的 xvalue),假设通过 rvalue refs 将它们传递给某个比较函数,那么我不明白为什么我可以'对 2 MyClass()
s (prvalue) 做同样的事情?
与此相关的另一个来源是这里的答案: 什么是移动语义?
请注意,即使 std::move(a) 是一个右值,它的求值也不会创建一个临时对象。这个难题迫使委员会引入第三个价值类别。可以绑定到右值引用的东西,即使它不是传统意义上的右值,也称为 xvalue(eXpiring 值)。
但这似乎与“可以比较地址”无关,并且a)我看不出这与右值的“传统意义”有何不同;b)我不明白为什么这样的原因需要语言中的新值类别(好吧,这允许为 OO 意义上的对象提供动态类型,但 xvalues 不仅仅指对象)。
c++ - 成员函数返回成员变量的右值引用
function 1
和 和有什么不一样function 2
?
将function 1
构造一个 temp vector
,move(data)
然后将 temp 分配vector
给v
?
没有更多的细节要添加...
c++ - C++ 中的 std::move() 和 xvalue
有人可以给我 xvalue 和 std::move() 行为的“非循环”定义/解释吗?
我查看了 cppreference 页面,它说“std::move() 产生一个 xvalue”。(好的)
然后我寻找“xvalue”的定义,它说的第一件事是它是一个函数调用或重载的运算符表达式,例如“std:move”。(???)