问题标签 [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 投票
1 回答
126 浏览

c++ - throw 表达式中是否允许使用纯右值省略

§[except.throw]中,标准说抛出异常从 throw 表达式复制初始化异常对象

抛出异常复制初始化(11.6,15.8)一个临时对象,称为异常对象

那么为什么下面的代码会在 C++17 上编译呢?

https://wandbox.org/permlink/R3WfzfnBAORTLVSy

复制初始化不包括任何符合prvalue省略的情况(从我看来)。那么为什么上面的代码在 C++17 中编译呢?

0 投票
1 回答
187 浏览

c++ - 为什么在 void 函数中接受 return throw std::exception()?

我错误地在 a 之后粘贴了一条throw语句,return最终结果如下:

我在注意到错误之前成功构建了解决方案,我很好奇哪个规范允许上述语法。


通过阅读cppreference.com(在 Notes 下),我看到

throw-expression 被归类为 void 类型的纯右值表达式。与任何其他表达式一样,它可能是另一个表达式中的子表达式,最常见于条件运算符中:

但我不太确定这是我要找的。

0 投票
2 回答
153 浏览

c++ - C++ 标准 N3337 5.2.10 第 7 条中的“类型纯右值”是什么意思?

C++ 标准草案 N33375.2.10节Reinterpret cast第 7节(强调我的)中:

对象指针可以显式转换为指向不同类型的对象指针。当“指向 T1 的指针”类型的纯右值 v转换为“指向 cv T2 的指针”类型时,结果是static_cast<cv T2*>(static_cast<cv void*>(v)) 如果 T1 和 T2 都是标准布局类型(3.9)并且 T2 的对齐要求不比那些更严格T1 的,或者如果任一类型为无效。

这是否意味着表达式v是纯右值?如果是这样,那么

上面,变量pa是 an lvalue,那么我们可以认为如果变量 oflvalue在正确的表达式中,变量是 aprvalue类型的吗?

0 投票
1 回答
1568 浏览

c++ - prvalues的cv-qualifications (revisited)

这是我之前的问题的后续问题,其中明显的共识是,prvalues 的 cv 限定处理的变化只是一个相当小的和无关紧要的变化,旨在解决一些不一致的问题(例如,返回 prvalues 并声明为 cv 限定返回的函数类型)。

但是,我在标准中看到另一个地方似乎依赖于具有 cv 限定类型的纯右值:const通过临时实现转换使用纯右值初始化引用。相关措辞可在9.3.3/5的多个位置找到

[...] 如果转换后的初始值设定项是纯右值,则其类型 T4 调整为类型“cv1 T4” ([conv.qual]) 并应用临时实现转换 ([conv.rval]) [...]

[...] 否则,初始化表达式被隐式转换为“cv1 T1”类型的纯右值。应用临时实现转换并将引用绑定到结果。

目的显然是为了确保当我们进行实际的临时物化转换时

7.3.4 临时物化转换
1 T 类型的纯右值可以转换为 T 类型的 xvalue。这种转换通过使用临时对象评估纯右值,从纯右值初始化 T 类型的临时对象([class.temporary])它的结果对象,并产生一个表示临时对象的 xvalue。[...]

它作为输入接收的类型T包括所需的 cv 限定。

但是,在非类非数组纯右值的情况下,该 cv-qualification 如何在7.2.2/2中存活下来?

7.2.2 类型
2如果prvalue 最初具有类型“cv T”,其中T 是无cv 限定的非类、非数组类型,则表达式的类型在任何进一步分析之前调整为T。

或者是吗?

例如,在这个例子中我们得到什么样的临时

是临时的const还是不是?我们能做到吗

不触发未定义的行为?如果我没记错的话,最初的意图是const int在这种情况下获得一个临时的。还是真的吗?(对于类类型,答案很明确——我们得到一个const临时的。)

0 投票
1 回答
47 浏览

c++ - 为什么函数调用是 xvalue(如果返回类型是 rvalue)?

假设我们有一个函数:

据我所知的表达式:

都是 xvalue。但为什么?为什么他们不是prvalue?我有点困惑。

0 投票
1 回答
100 浏览

c++11 - 我应该采取哪些步骤来确定表达式的值类别?

我对确定表达式的值类别感到很困惑。您能否提供确定表达式的值类别应采取的基本步骤(应分析什么)?

0 投票
0 回答
57 浏览

c++ - rvalue、lvalues、xvalues、glvalues 和 prvalues 的示例?

这篇文章什么是右值、左值、xvalues、glvalues 和 prvalues?提供了 rvalue、lvalues、xvalues、glvalues 和 prvalues 的定义,但我没有看到示例。

我认为我对 lvalues 和 rvalues 有深入的了解,但对 xvalues、glvalues 和 prvalues 了解不多。每个示例(代码)及其区分确实会有所帮助。

0 投票
1 回答
66 浏览

c++ - xvalue 和 prvalue 之间的一些区别

我最近一直在仔细研究 C++ 类别。lvalue 和 rvalue 之间的区别似乎很清楚,但是当谈到 prvalue 和 xvalue 时,我感到困惑。
给出下面的例子:

运行示例,控制台输入:
123
123
123
-858993460
谁能解释为什么它在最后一个输出中给出了一个意外的值?
这个例子展示了 xvalue 的什么特征?

0 投票
2 回答
62 浏览

c++ - 使 ++o++ 抱怨具有用户定义的前置和后缀增量运算符的类型

我正在寻找一种方法来防止++x++使用用户定义的前缀和后缀增量运算符的类型。

对于内置类型,后缀运算符的结果类型不是左值而是纯右值表达式,编译器抱怨得很好。

我能想到的最简单的事情是为后缀增量运算符返回 const:

这是一个神螺栓

这种方法有缺陷吗?

编辑:

多亏了答案,我在这里这里以及当然在cppreference上找到了更多信息。

0 投票
1 回答
104 浏览

c++ - C++17 编译器(gcc 或 Microsoft Visual C++),是否有一个选项禁止“不产生临时”功能

在以下情况下,我如何告诉 С++17 编译器创建临时文件(即 C++17 编译器必须考虑复制/移动操作,就像 C++11 和 C++14 编译器一样)

输出(c++14 - 这就是我想要的):

输出(c++17):

我的客户拥有大量 C++11 代码和 C++17 编译器:gcc 8.3.0 和 Microsoft C++ 编译器(来自 Visual Studio 2017 和 2019)。并且有很多地方包含上面的代码。C++17 编译器是否有一个选项可以在这种情况下禁止“不产生临时”功能?