问题标签 [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.
c++ - 获取右值的地址
这不适用于 GCC 4.6,而它曾经在以前的版本中工作。
现在它说:获取 xvalue 的地址(右值引用)。
有什么方法可以安全地将右值的地址传递给另一个函数?
c++ - 将函数声明为 BigStruct&& foo(...); 是一种好习惯吗?
输出是:
示例代码显然表明 f_1() 比 f_2() 更有效。
所以,我的问题是:
我们是否应该总是将函数声明为 some_return_type&& f(...); 而不是 some_return_type f(...); ?
如果我的问题的答案是正确的,那么接下来是另一个问题:
有许多函数声明为 some_return_type f(...); 在 C++ 世界中,我们应该将它们更改为现代形式吗?
pointers - Go中的临时地址?
处理这种情况的最干净的方法是什么:
这会产生错误:
不能取 a() 的地址
我的理解是,如果获取地址,Go 会自动将局部变量提升到堆中。这里很清楚,要取返回值的地址。处理这个问题的惯用方法是什么?
c++ - 数组和右值(作为参数)
我想知道是否有任何方法可以区分以下代码中显示的函数调用(以数组作为参数):
foo“函数族”能够区分临时对象和命名对象。不是 foo_array 的情况。
在 C++11 中可能吗?如果没有,你认为可能吗?(显然改变了标准)
问候。费尔南多。
c++ - 右值引用不在 Mac OS X 10.7.4 和 FreeBSD 9.0 上
这是我的代码
当我使用 GCC 4.7.0 或 clang 3.1 和 --std=c++0x 在 Linux 上编译代码时,它输出 0 和 2。但是,当我在 Mac OS X 10.7.4 或 FreeBSD 9.0 上使用带有--std=c++0x 的clang 3.0 或clang 3.1,它输出2 和2。我的Mac OS X 和FreeBSD 上的GCC 是v4.2.1,它不支持--std=c++0x。所以我使用了 Boost.Move:
当我使用带有 -I~/boost_1_49_0 的 GCC 4.2.1 在 Mac OS X 上编译代码时,它仍然输出 2 和 2。
更新:当我添加 --stdlib=libc++ 时,代码输出 0 和 2。右值引用似乎工作。但是,当我将向量类型从 size_t 更改为 string 时,我得到了一个编译错误,即使我注释了最后三行代码。这次问题与右值引用无关,而是来自 push_back() 函数。当我删除 --stdlib=libc++ 时,它可以通过编译。
哪个铿锵
clang++ --std=c++11 --stdlib=libc++ rval.cpp
c - C如何识别右值和左值?
在 C 中,有没有办法识别右值和左值?
其中一些很容易识别,比如在赋值中,左边的值是左值,右边的值是右值。
但在其他情况下,很难识别这样的规则。
例如:*p++
and i++
(其中 p 是指向整数的指针,i 是整数) - 如何识别它是右值还是左值?上下文是++*p++
有效的,而++i++
不是因为i++
是右值(正如严肃的人所说)。
如何识别表达式中的右值和左值?
c++ - 返回*这个;删除指针
我认为发生的是A
SetVar 返回的右值是相同的副本Class
并共享相同的指针Var
。但是当右值调用它的解构函数时,它会删除Class
's Val
。
等于8 POINT A
*Val
,但POINT B
*Val
等于-17891602
。由于尝试删除Val
两次,我还得到 _BLOCK_TYPE_IS_VALID(pHead->nHeadUse) 。
删除解构函数可以解决问题,但会造成内存泄漏。
c++ - 我什么时候应该选择复制省略而不是通过 const 引用传递参数?
可能重复:
按值传递是 C++11 中合理的默认值吗?
我在读想要速度?按值传递。戴夫亚伯拉罕关于复制省略和 RVO。我想知道为什么我们需要复制省略?
我被告知太多次,你应该通过 const 引用传递函数参数以避免复制(我读过的几乎每一本 c++ 书籍都告诉我这一点)。
假设我们有两个函数:
如果实际参数是右值,则在两个函数中都将避免复制。但是如果实际参数是一个左值,复制只会在 f1 中避免,而不是在 f2 中。那么为什么我们需要这个功能呢?
c++ - 右值委托,或 const 成员函数的右值等价物
显然,上面评论中的函数不是合法的 C++,但我需要知道是否有办法做到这一点:
依此类推,而每次调用frob()
都会有效地调用其“移动”版本。由于这是可以在编译时确定的,我想不出任何理由让它不以某种形式存在。
我可以这样写:
这将导致:
这读起来有点烦人,也没有实现我用委托“拼写出来”的目标。
c++ - 三元运算符的结果不是右值
如果您使用 C++11 编译器编译此程序,则向量不会移出函数。
如果您像这样返回实例,它会被移动。
我用 gcc 4.7.0 和 MSVC10 试过了。两者的行为方式相同。
我猜为什么会发生这种情况:
三元运算符类型是左值,因为它是在执行 return 语句之前评估的。此时 a 和 b 还不是 xvalues(即将到期)。
这个解释正确吗?
这是标准的缺陷吗?
这显然不是预期的行为,在我看来是一个非常常见的情况。