问题标签 [prvalue]

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

c++ - 第二个常量引用可以延长临时对象的寿命吗

  • 背景:

我注意到 std::max 的签名是:

模板<typename T>
const T& max(const T&, const T&);

我想知道返回对 const T 的引用的含义...

如果我们传入两个 L 值,那么我们可以返回对这两个值之一的引用是有意义的。但是如果我们传入两个 PR 值,返回的是什么,使用它是否安全?

问题:

我与一些同事交谈,这里是这个问题的一个最小的工作示例:http: //cpp.sh/4en4

没有优化:

适度:

使用不同级别的优化运行它会产生不同的结果。但是,在所有情况下,返回引用似乎都不会延长本地对象的生命周期。它的析构函数仍然被调用,尽管在一种情况下我们似乎恢复了对被破坏对象的引用,而在另一种情况下,我们似乎有一个悬空指针。

标准:

引用 C++ 标准,文档编号 N4618:

12.2 第 6 项:

...当引用绑定到临时。引用绑定到的临时对象或引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,但以下情况除外:
(6.1) — 在函数调用中绑定到引用参数的临时对象(5.2.2) 一直持续到包含调用的完整表达式完成。
(6.2) — 在函数返回语句 (6.6.3) 中临时绑定到返回值的生命周期没有延长;临时在 return 语句中的完整表达式结束时被销毁。”

从 (6.1) 开始,对于初始化 b 的整个语句,似乎应该存在一个临时的 foo(2)。

从 (6.2) 开始,似乎本地 'a' 被破坏了,这实际上破坏了临时 foo(2),导致 b 具有破坏值。

我的问题:

1a。什么是包含由 foo(2)in生成的临时的完整表达式const temp& b = foo(2);

1b。第二个 const 引用可以延长临时对象的生命周期吗?

  1. 考虑到明显的危险,为什么要这样实现 std::max ?
0 投票
1 回答
293 浏览

c++ - 构造函数调用是纯右值表达式

在 C++标准中,可以找到纯右值表达式的示例:

“公允价值

以下表达式是纯右值表达式:

文字(字符串文字除外),例如 42、true 或 nullptr;

非引用返回类型的函数调用或重载运算符表达式,例如 str.substr(1, 2)、str1 + str2 或 it++; ……”

这是T()(构造函数调用)之类的表达式会去的地方吗?

这种表达方式还有别的名字吗?

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

c++ - 获取此地址时出现“表达式必须是左值或函数指示符”错误

我正在尝试在 C++ 中执行此操作:

我在 Visual Studio 2015 中得到“表达式必须是左值或函数指示符”错误。所以我不明白我哪里出错了。据我所知,&this应该有正确的类型Abc**吗?

函数定义不是我要更改的。所以我不能只改变参数类型。

0 投票
1 回答
80 浏览

c++ - 问:为什么_rvalues_被重命名为_prvalues_?(纯右值)

该文档似乎是 C++11 中这些更改的来源:n3055

二、变更概览

右值,目前在核心语言子句中已知,被重命名为“<strong>prvalues”(“纯”右值)。

lvalues的含义没有改变,但是引入了glvalues来覆盖xvalues

为什么不对右值做同样的事情?!

rvalues 的含义应该保持不变,但也引入了grvalues来覆盖xvalues。(纯右值可以被替换回简单的右值,与值的定义方式对称)

可以更简单地定义值类别:

  • 左值具有标识不能从中移动;是不是 xvalue 的 glvalue
  • 右值没有身份,但可以; 是不是 xvalue 的 grvalue
  • 一个xvalue具有标识并且可以.

每个表达式都是左值xvaluervalue

0 投票
2 回答
656 浏览

c++ - 我们如何测试是否可以使用纯右值调用某种类型的表达式?

中,我们有花哨的is_invocable新纯右值和花哨的新纯右值,它们并不是真正的值。

这允许您创建一个对象,而不必先从逻辑上构造它,然后省略构造。

我遇到了一个问题,使用std::is_invocable来测试你是否可以调用某些东西,并且prvalue规则似乎发生冲突:

现在我们可以问是否f可以使用类型的纯右值调用no_move

std::is_invocable< decltype(&f), no_move >不起作用,因为它使用std::declval<no_move>()which is an x​​value like no_move&&not a prvalue of type no_move

中这是相同的,但保证省略使一些函数可以用 xvalue(即“ T&&”)调用,而另一些函数可以用 prvalues 类型调用T

是否有替代方案,或者我们必须发明自己的特征来处理这种情况?

(在一个std::declval<T>返回T而不是 ,T&&的理论世界中is_invocable,我相信会做正确的事情)。

0 投票
1 回答
69 浏览

c++11 - 是否将prvalue移动到函数模板uref参数中?

我的问题是将 std::move (或不) prvalue 放入一个包罗万象的函数模板中是否有意义,该模板相应地在其签名中采用通用引用 T&& 。另外我想知道复制移动省略/RVO 是否在这个决定中发挥了作用。

问题:引用折叠是否会导致使用 T&&(右值引用)调用带有或不带 std::move 的 foo 并且 RVO 对此有任何影响(或对 RVO 有影响)吗?

提前感谢山姆