问题标签 [value-categories]

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

c++ - 对纯右值的左值引用的地址代表什么?

当函数参数是左值引用类型时lref

lref绑定到一个纯右值:

地址代表什么?那里住着什么?

prvalue 不能获取其地址。但是对纯右值的左值引用可以获取它的地址,这对我来说很奇怪。

0 投票
2 回答
112 浏览

c++ - 将非类非数组纯右值强制转换为 cv 限定类型是否合法?

我正在阅读value categories,并遇到以下内容(为简洁起见,省略了很多):

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

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

特性:

  • 非类非数组纯右值不能是 cv 限定的。

但是......以下程序在 ideone.com和 g++ 5.4.0 上编译并运行良好:

我知道编译器提供了扩展,如果遇到未定义的行为,它们可以做各种各样的事情。我只是想弄清楚标准的要求。

N4296中,我发现以下相关段落:

[表达式]

[...内容省​​略...]

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

“最初”这个词让我很震惊。目前尚不清楚这是否允许作为另一个表达式的结果,例如用户将非类非数组纯右值显式转换为 cv 限定类型(产生另一个纯右值),或者这是否仅适用于“根" 表达式(42在这种情况下)。

我的问题是,标准是否允许这样的表达式(它只是去掉了 cv 限定符),还是不允许这样做(如果相关,这在哪里是强制性的)?

0 投票
0 回答
80 浏览

c++ - 第二个和第三个操作数是相同类型和值类别的变量的条件表达式的结果的赋值是否持续存在?

在学习值类别时,我发现以下代码段编译并运行得很好:

这是输出:

首先,我检查了这个语句是否合法 C++,我认为是因为以下原因:

N4296 5.16.4 条件运算符 [expr.cond]

如果第二个和第三个操作数是相同值类别的glvalues并且具有相同类型,则结果是该类型和值类别,并且如果第二个或第三个操作数是位域,则它是位域,或者如果两者都是位域。

鉴于xy都是左值(因此也是左值),两种情况下条件表达式的结果都是左值。在此基础上,该表达似乎是有效的。然而,尚不清楚这是否应该有任何影响。

我不确定条件语句是否应该起作用的原因是因为第二个和第三个操作数类型的类型是int. 即使这个结果int是一个左值,也不意味着它必须引用xor y。它本质上可能是一个虚拟变量,不会产生任何影响,并且符合标准。换句话说,我认为没有理由将其解析为一个int&而不是一个单独的int.

我的问题是...

这种行为是否正确,为什么?


我事先看了一下这个问题,但不相信它回答了我的问题。这个问题的答案是指一个较旧的标准,有不同的措辞,并且不回答我关于结果是否为int&to的问题x

0 投票
1 回答
296 浏览

c++ - lambda 捕获的 const int 变量的值类别

我一直在尝试了解何时以及何时不具有捕获默认 odr 的 lambda 使用具有在其周围范围内定义的自动存储持续时间的变量(由此答案提示)。在探索这个问题时,我遇到了一点好奇。nGCC 和 Clang 似乎对以下代码中id-expression 的值类别存在分歧:

Clang 成功编译代码,而 GCC 没有 ( error: use of deleted function)。哪一个是正确的?或者这是未指定或实现定义的东西?

绑定对对象的引用应该是 odr-use 它,这可以通过删除 lambda 的 capture-default 并观察到两个编译器抱怨如果n没有 capture-default 就无法隐式捕获来确认。

将 lambda 标记为mutable对编译器的输出没有明显影响。

0 投票
1 回答
128 浏览

c++11 - 在 C++ 11 中,Lvalue 具有标识但不可移动是什么意思?

我现在正在研究 C++ 11,并且对 C++ 11 中表达式的值类别感到困惑。根据术语,左值是 W 的左上角,即 iM(或有时是 im),意思是“有身份但不能移动从”。这真的让我很困惑。请考虑以下示例:

这个例子编译得很好。

我们都知道赋值b = c是一个左值,那么他们所说的“不能被移动”是什么意思呢?请举出能清楚说明这一点的例子!

谢谢!

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 回答
125 浏览

c++ - 有没有我可以直接获取地址的右值?

我可以通过绑定到引用来获取右值的地址(据我所知,它本身只能由左值引用)。

有什么方法可以获取我可以直接获取地址的右值(即 like&(<rvalue>)将是一个有效的表达式,而不是覆盖operator&())?

或者也许至少可以通过“绑定”到另一个右值?(情况似乎并非如此,因为我们只能“绑定”到左值引用,见上文。但也许我在这里遗漏了一些类似的概念。)

我试图回答的更一般的问题是以下是否正确:右值严格对应于一组可以直接获取地址的表达式,左值位域和其他一些“特殊”类型的左值除外。

0 投票
1 回答
75 浏览

c++ - 标准在哪里定义了将值绑定到引用的优先顺序?

正如这里所解释,不同类别的值根据以下优先顺序绑定到不同类型的引用:

标准中的哪个位置描述了这种优先顺序?