问题标签 [rvalue]

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 投票
6 回答
334 浏览

c++ - 文字值的范围是什么,编译器如何为其分配内存?

12据说是整数文字,因此不能在 LValue 中使用。

  1. 编译器如何为文字分配内存?
  2. 文字的范围是什么?
  3. 为什么我们不能在其范围内获得带有 &12 的地址?
0 投票
7 回答
239 浏览

c++ - RValue 由什么构成?

RValues 是不可操作的内存区域,所以像整数这样的文字被认为是 RValues。

  1. 常量是否构成 RValues?const int x = 0;至少可以操作一次。
  2. 现在,编译器创建的临时对象也是 RValue,即使它们具有可操作的内存区域。为什么呢?
    因为它们不能被“用户”修改?这是原因吗?

那么,“用户”无法操作的内存区域称为 RValue 吗?

0 投票
1 回答
858 浏览

c++ - 返回的对象如何可分配?

在 Effective C++, Item 3 中,Scott Meyers 建议operator*对名为 的类进行重载Rational

返回值是const-qualified 的原因在以下行中解释:如果不是const,程序员可以编写如下代码:

或者,更有可能:

很公平。现在我很困惑,因为我认为一个函数的返回值,这里是 operator*,是一个右值,因此不可赋值。我认为它不可分配,因为如果我有:

那将无法使用invalid lvalue in assignment. 为什么这里不会发生?有人可以对此有所了解吗?

编辑:我在 Scott Meyers 的那个项目上看到了许多其他线程,但没有一个解决我在这里暴露的右值问题。

0 投票
2 回答
9714 浏览

c++ - C ++中的右值绑定混淆

我认为应该(大约)相同地对待三个函数调用,但显然它们不是。我试图理解为什么三个之一不能编译(g++ -std=c++0x)。

这个问题有点像 C++0x rvalue references - lvalues-rvalue binding,但是,如果它在那里得到了回答,我很抱歉,我无法将它提炼出来。

我想要的是能够用任何类型的字符串调用我的函数 bar() 并让它正常工作。定义就足够了void barR(const string &x),但我真的很想了解原因。

非常感谢您在理解第三次调用为何不同方面提供的任何帮助。

0 投票
2 回答
2008 浏览

c++ - C++03. 在编译时测试 rvalue-vs-lvalue,而不仅仅是在运行时

在 C++03 中,Boost 的 Foreach 使用这种有趣的技术,可以在运行时检测表达式是左值还是右值。(我通过这个 StackOverflow 问题发现:Rvalues in C++03

这是在运行时工作的演示

(这是我在考虑我最近提出的另一个问题时出现的一个更基本的问题。对此的答案可能有助于我们回答另一个问题。)

现在我已经说明了问题,在编译时测试 C++03 中的右值性,我将谈谈我迄今为止一直在尝试的事情。

我希望能够在compile-time进行此检查。在 C++11 中这很容易,但我对 C++03 很好奇。

我正在尝试以他们的想法为基础,但也会对不同的方法持开放态度。他们技术的基本思想是将这段代码放入一个宏中:

左边是“真” ?,因此我们可以确定 EXPRESSION 永远不会被计算。但有趣的是,?:运算符的行为取决于其参数是左值还是右值(单击上面的链接了解详细信息)。特别是,它将rvalue_probe以两种方式之一转换我们的对象,具体取决于 EXPRESSION 是否为左值:

这在运行时有效,因为抛出的文本可以被捕获并用于分析 EXPRESSION 是左值还是右值。但我想要一些方法来识别,在编译时,正在使用哪种转换。

现在,这可能很有用,因为这意味着,而不是询问

EXPRESSION 是右值吗?

我们可以问:

编译器何时编译true ?rvalue_probe() : EXPRESSION,选择两个重载运算符中的哪operator X一个operator X&

(通常,您可以通过更改返回类型并获取它来检测调用了哪个方法sizeof。但是我们不能使用这些转换运算符来做到这一点,尤其是当它们被埋在. 中时?:。)

我以为我可以使用类似的东西

如果 EXPRESSION 是一个左值,则operator&选择了,我希望整个表达式将是一个&类型。但这似乎不起作用。ref 类型和非 ref 类型很难区分(不可能?),尤其是现在我正试图在?:表达式中挖掘以查看选择了哪个转换。

这是粘贴在这里的演示代码:

(最后我在这里有一些其他代码,但这只是令人困惑的事情。你真的不想看到我在答案中失败的尝试!上面的代码演示了它如何在运行时测试左值与右值。)

0 投票
1 回答
654 浏览

c++ - const_cast 的行为

我正在阅读 C++ 中的 const_cast 运算符

1.我无法理解的第一件事是

const_cast 运算符语法,即

-const_cast--<--Type-->--(--expression--)--------------------><

我对这种语法的理解是它有助于抛弃expression类型的Type常量。但是考虑一下这段代码

在 line 中ConstTest *c = const_cast<ConstTest*>(this),我认为this指针的 const 应该被丢弃,但输出显示它是 this引用的对象失去了它的 const-ness。

我觉得代码应该是ConstTest *c = const_cast<ConstTest>(*this),但这会产生错误。我知道我在很多解释上都错了。请全部纠正。

2.我的第二个问题是下面给出的陈述

const_cast 表达式的结果是一个右值,除非 Type 是一个引用类型。在这种情况下,结果是一个左值。

为什么会这样,为什么在指针的情况下它不是真的?

0 投票
2 回答
188 浏览

c++ - 如何构造一个接收引用参数的基类?

我无法使用 g++ 4.1.2 编译以下代码:

我得到:

将类型的右值表达式无效std::auto_ptr<A>转换为类型std::auto_ptr<A>&

问题是我无法定义变量并传递它的引用,因为我在初始化列表中。

当我只被允许改变班级时,我该怎么做C

0 投票
1 回答
4583 浏览

c++ - C++11:为什么允许分配右值?

据我了解,从函数返回右值引用很危险的原因是由于以下代码:

这留下y了一个未定义的悬空引用。

但是,我不明白为什么上面的代码甚至可以编译?是否有合理的理由将右值引用分配给另一个右值引用?粗略地说,右值不应该是“临时变量”,即在表达式结尾处无效吗?能够分配它们对我来说似乎很愚蠢。

0 投票
2 回答
3335 浏览

c++ - 指向右值的指针

在寻找调用同时接受左值和右值引用的函数的解决方案时,我编写了以下代码(不,我保证再也不会这样做了)。

目标是提供一个同时接受左值和右值引用的函数,我不想编写两个函数或真正关心调用方的左值/右值。因此,我想提供一些包装参数的宏/函数,以便可以传递它是否是 l/rvalue - 在本例中为 get_addr。

在任何情况下,我都不想更改传递给函数的数据。

虽然该代码对我来说运行良好,但我怀疑它是否安全。我的猜测:从 shared_ptr 调用 get() 后,get_value() 的结果不再是必需的,可能会被忽略。因此, print_value 可能会收到无效的引用。那有意义吗?无论如何,我不喜欢我提供的代码。我通过使用临时变量解决了这个问题。

尽管如此,我仍然很好奇这个问题是否有更好的解决方案。从语法的角度来看,我最好只有一个函数“void print_value(int&& p)”接受两个 l/rvalues。我查看了移动语义、左/右值转换,但没有找到真正看起来不错的解决方案。

0 投票
2 回答
312 浏览

c++ - 那么,现在 C++11 中的基本类是如何编写的呢?

更新:我使用 MSVC10,它没有给我默认的移动语义

假设我想创建一个包含几个非 pod 成员的常规类;

像往常一样,我实现了一个复制构造函数和一个使用复制构造函数的赋值运算符:

然后我实现 move-constructor 和 move-assignment,它对所有成员使用 std::swap 而不是 std::move,因为它们可能是在 move-semantics 可用之前编写的,因为实现了 move-semantics,我可以省略实现交换成员函数:

这是我的问题;假设我对成员一无所知,这里可以做一些更笼统的事情吗?

例如,移动构造函数与 const 声明的成员不兼容,但是如果我实现移动构造函数,因为Foo(Foo&& other) : a_(std::move(other.a_)), b_(std::move(other.b_)){}我不能确定没有移动语义的类不会被复制?我可以以某种巧妙的方式在移动分配中使用移动构造函数吗?