问题标签 [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.
c++ - throw 表达式中是否允许使用纯右值省略
在§[except.throw]
中,标准说抛出异常从 throw 表达式复制初始化异常对象
抛出异常复制初始化(11.6,15.8)一个临时对象,称为异常对象
那么为什么下面的代码会在 C++17 上编译呢?
(https://wandbox.org/permlink/R3WfzfnBAORTLVSy)
复制初始化不包括任何符合prvalue省略的情况(从我看来)。那么为什么上面的代码在 C++17 中编译呢?
c++ - 为什么在 void 函数中接受 return throw std::exception()?
我错误地在 a 之后粘贴了一条throw
语句,return
最终结果如下:
我在注意到错误之前成功构建了解决方案,我很好奇哪个规范允许上述语法。
通过阅读cppreference.com(在 Notes 下),我看到
throw-expression 被归类为 void 类型的纯右值表达式。与任何其他表达式一样,它可能是另一个表达式中的子表达式,最常见于条件运算符中:
但我不太确定这是我要找的。
c++ - C++ 标准 N3337 5.2.10 第 7 条中的“类型纯右值”是什么意思?
在C++ 标准草案 N3337第5.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
类型的吗?
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
临时的。)
c++ - 为什么函数调用是 xvalue(如果返回类型是 rvalue)?
假设我们有一个函数:
据我所知的表达式:
都是 xvalue。但为什么?为什么他们不是prvalue?我有点困惑。
c++11 - 我应该采取哪些步骤来确定表达式的值类别?
我对确定表达式的值类别感到很困惑。您能否提供确定表达式的值类别应采取的基本步骤(应分析什么)?
c++ - rvalue、lvalues、xvalues、glvalues 和 prvalues 的示例?
这篇文章什么是右值、左值、xvalues、glvalues 和 prvalues?提供了 rvalue、lvalues、xvalues、glvalues 和 prvalues 的定义,但我没有看到示例。
我认为我对 lvalues 和 rvalues 有深入的了解,但对 xvalues、glvalues 和 prvalues 了解不多。每个示例(代码)及其区分确实会有所帮助。
c++ - xvalue 和 prvalue 之间的一些区别
我最近一直在仔细研究 C++ 类别。lvalue 和 rvalue 之间的区别似乎很清楚,但是当谈到 prvalue 和 xvalue 时,我感到困惑。
给出下面的例子:
运行示例,控制台输入:
123
123
123
-858993460
谁能解释为什么它在最后一个输出中给出了一个意外的值?
这个例子展示了 xvalue 的什么特征?
c++ - 使 ++o++ 抱怨具有用户定义的前置和后缀增量运算符的类型
我正在寻找一种方法来防止++x++
使用用户定义的前缀和后缀增量运算符的类型。
对于内置类型,后缀运算符的结果类型不是左值而是纯右值表达式,编译器抱怨得很好。
我能想到的最简单的事情是为后缀增量运算符返回 const:
这种方法有缺陷吗?
编辑:
多亏了答案,我在这里、这里以及当然在cppreference上找到了更多信息。
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 编译器是否有一个选项可以在这种情况下禁止“不产生临时”功能?