19得票4回答
为什么as_const禁止rvalue参数?

我想问为什么as_const禁止rvalue参数,根据cppreference.com(即为什么标准委员会这样做,而不是cppreference.com特别引用它们的原因。也不是为了确保委员会意图的规范在哪里被编码,只是为了确保:))。这个(人为制造的)例子将产生一个错误(用户希望将其设置为c...

19得票4回答
常量引用和左值

我们不能写成int& ref = 40,因为我们需要右边的lvalue。但是我们可以写const int& ref = 40。为什么呢?因为40是一个rvalue而不是一个lvalue。 我知道这是一个例外,但是为什么呢?

19得票2回答
非POD对象的xvalue和prvalue允许使用或行为上的区别是什么样的?请举一个例子。

什么是rvalue、lvalue、xvalue、glvalue和prvalue?提供了rvalues/lvalues分类的良好概述,该问题的一个最近回答(https://dev59.com/QnA65IYBdhLWcg3w1SfU#9552880)强调了prvalues类似于旧式rvalues...

19得票1回答
C++运算符的操作数如果未指定,则其值类别是什么?

前提: C++11标准将表达式分类为三种不相交的值类别:左值(lvalues)、右值引用(xvalues)和纯右值(prvalues)(§3.10/1)。可以在此处找到有关值类别的解释,例如这里。 我正在努力弄清楚不同运算符对其操作数的值类别的要求是什么。第3.10/1段规定: [...

18得票4回答
延长临时物品的使用寿命

允许这个的设计理念是什么? const Foo& a = function_returning_Foo_by_value(); 但不是这个 Foo& a = function_returning_Foo_by_value(); ? 第二行可能会出什么问题(第一行已...

18得票2回答
为什么“decltype(i+j)”的结果不是一个右值引用?

我正在尝试提供一个简单的示例,演示一种产生rvalue(右值)的操作。 这个测试用例本应该有效,但出乎意料地(对我而言),将两个 int 相加得到的结果不是rvalue(引用)。我漏掉了什么?void test(int i, int j) { // this assert shoul...

18得票1回答
为什么std::forward有两个重载?

根据以下引用折叠规则: T& & --> T& T&& & --> T& T& && --> T& T&& && --> T&& ...

18得票5回答
为什么 T() = T() 是被允许的?

我相信表达式 T() 会创建一个 rvalue(根据标准)。然而,下面的代码可以编译通过(至少在 gcc4.0 上): class T {}; int main() { T() = T(); } 我知道这在技术上是可能的,因为成员函数可以在临时对象上调用,上述代码只是在从第一个...

18得票1回答
一个返回的对象如何可以被赋值?

在《Effective C++》的第三条建议中,Scott Meyers建议对名为Rational的类重载operator*。 class Rational { ... }; const Rational operator*(const Rational& lhs, co...

18得票3回答
如何识别Rvalue或Lvalue引用以及if-it-has-a-name规则

我正在阅读Thomas Becker关于右值引用和其使用的文章。在其中,他定义了所谓的如果它有一个名字(if-it-has-a-name)规则: 声明为右值引用的东西可以是左值或右值。区分的标准是:如果它有一个名字,那么它就是一个左值。否则,它就是一个右值。 对我来说,这听起来非常...