问题标签 [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.

0 投票
1 回答
555 浏览

c++11 - std::move(a).m 是 xvalue 还是 prvalue?

假设是非引用类型 ( )m的非静态数据成员。T根据 cppreferencestd::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).mxvalue还是prvalue?

0 投票
2 回答
742 浏览

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++ 中延长时,我很难理解

0 投票
1 回答
150 浏览

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。

0 投票
2 回答
217 浏览

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?谢谢。

0 投票
1 回答
1043 浏览

arrays - HighChart如何使用对象数组

.json 文件:

我不知道如何在 HighChart 上使用对象数据

当我使用它时

然后它什么都不起作用:所以我想知道如何使用对象数据集(key_as_string vlaue,匹配 x 值)
(doc_count vlaue,匹配 y 值)

我只能通过制作数字数组来绘制 y.value

图表选项设置

0 投票
1 回答
1025 浏览

c++ - 为什么右值引用绑定到 xvalue 在我的代码中不起作用?

我试图理解 C++11 中的左值和右值。于是我写了一段测试代码:

它工作得很好,所以我插入了 std::cout 来打印结果。

int&& rr5 = baz(); std::cout << rr5;导致运行时错误,但我不知道为什么会出错。

我认为的返回值baz()将是 xvalue,因此它的生命周期会延长。但是当我试图访问它的值时,就会发生错误。为什么?

0 投票
1 回答
89 浏览

c++ - 5 与 std::move(5) 的行为差异

我已经阅读了关于不同值类别的所有主要问题,但仍然不清楚在这种情况下,xvalues 与 prvalues 之间的区别。

我知道,像所有glvalues一样,xvalues的动态类型可以不同于静态类型,但是例如,在文字与std::move文字的情况下,我找不到“真正的”行为差异(可能除了那些正式基于什么的xvalue 和什么是 prvalue,比如哪个构造函数将被调用MyClass(std::move(5));但对于文字来说,这似乎并不重要,因为它们的值无论如何都不会被使用。

我可以从调用std::move文字中获得什么实际的“好处”?

0 投票
2 回答
308 浏览

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().members 的地址(根据 cppreference 的 xvalue),假设通过 rvalue refs 将它们传递给某个比较函数,那么我不明白为什么我可以'对 2 MyClass()s (prvalue) 做同样的事情?

与此相关的另一个来源是这里的答案: 什么是移动语义?

请注意,即使 std::move(a) 是一个右值,它的求值也不会创建一个临时对象。这个难题迫使委员会引入第三个价值类别。可以绑定到右值引用的东西,即使它不是传统意义上的右值,也称为 xvalue(eXpiring 值)。

但这似乎与“可以比较地址”无关,并且a)我看不出这与右值的“传统意义”有何不同;b)我不明白为什么这样的原因需要语言中的新值类别(好吧,这允许为 OO 意义上的对象提供动态类型,但 xvalues 不仅仅指对象)。

0 投票
1 回答
538 浏览

c++ - 成员函数返回成员变量的右值引用

function 1和 和有什么不一样function 2

function 1构造一个 temp vectormove(data)然后将 temp 分配vectorv?

没有更多的细节要添加...

0 投票
2 回答
926 浏览

c++ - C++ 中的 std::move() 和 xvalue

有人可以给我 xvalue 和 std::move() 行为的“非循环”定义/解释吗?

我查看了 cppreference 页面,它说“std::move() 产生一个 xvalue”。(好的)

然后我寻找“xvalue”的定义,它说的第一件事是它是一个函数调用或重载的运算符表达式,例如“std:move”。(???)