问题标签 [move-semantics]
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++ - 将左值绑定到右值引用移动 ctor 并返回函数
据我所知,将左值绑定到右值引用是无效的。其次,左值表达式可以通过地址运算符 (&) 作为前缀来识别
如果这两个句子在以下代码中是正确的,我有点麻烦:
我哪里错了?
templates - 关于 postblit 和 move 语义的问题
前段时间我已经问过一个类似的问题,但我仍然不清楚一些细节。
什么情况下调用postblit构造函数?
移动对象的语义是什么?它会被postblitted和/或破坏吗?
如果我按值返回局部变量会发生什么?它会被隐式移动吗?
如何将表达式转换为右值?例如,通用交换会是什么样子?
c++ - 是否需要销毁移出的对象?
如果我 move-construct a
from b
,是否仍然需要destruct b
,或者我可以不这样做就逃脱?
optional<T>
这个问题在模板的实现过程中闪过我的脑海。摘抄:
当然,我可以将 bool 替换为initialized
一个区分已初始化、未初始化和移出的三值枚举。我只想知道这是否是绝对必要的。
c++ - 我可以用移出的对象做什么?
标准是否准确定义了一个对象一旦被移出我可以做什么?我曾经认为你可以对一个移动的对象做的就是破坏它,但这还不够。
例如,以swap
标准库中定义的函数模板为例:
显然,必须可以分配给移动对象,否则第 2 行和第 3 行将失败。那么我还能对移动的对象做什么呢?我究竟在哪里可以找到标准中的这些细节?
(顺便说一句,为什么它T c = std::move(a);
不是T c(std::move(a));
在第 1 行?)
c++ - 移动语义和返回 const 值
我有将所有内容作为“const”值返回的习惯(?!?!?)。像这样...
使用移动操作和右值引用以及以下功能...
我已经写不下去了……
我开始使用返回 const 值的约定的主要原因是为了防止有人编写这样的代码......
用例如下...
看起来好像“返回 const 值”和 r 值引用不会在这个特定用例中混合使用。那正确吗?
无论如何,该对象是临时的。为什么“const”应该阻止移动?为什么我们不能移动“const”临时对象?
operator-overloading - `M operator+(M&&,M&&)` 的 C++11 重载
更新:澄清,更清晰的重点和缩短的例子:
- 我可以避免
M op+(M&&,M&&)
过载吗?假设,我想要很好地处理RValues?我想其他三个重载是必需的。
(&&,&&)
我首先过载的原因:
- 通常我不会提供
M op+(&&,&&)
,但我似乎需要它:当提供重载时(&&,&)
,(&,&&)
编译器会变得模棱两可。有没有更好的方法来解决它然后添加另一个实现变体?
您还可以查看完整的代码。
c++ - 将可修改的右值引用绑定到可修改的左值
我有3个问题:
我可以将左值直接绑定到右值引用吗?
那个存在的对象会发生什么
std::move()
?std::move 和 有什么区别
std::forward
?
c++ - 参数评估后是否对参数绑定进行排序?
假设我有以下功能:
如果我这样调用函数:
在绑定到参数之前,是否所有参数都已完全评估?在这种情况下,std::move
是无害的,因为它只产生一个引用 的 xvalue numbers
。或者每个单独的参数是否可以在评估后立即绑定到它的参数?在这种情况下,numbers[0]
可能会导致未定义的行为,因为numbers
可能已经被移入vec
.
c++ - Initializer-list-构造一个不可复制(但可移动)对象的向量
可以将push_back
不可复制但可移动类型的右值转换为该类型的向量:
但是,当我尝试使用相同的右值初始化向量列表时,我收到有关需要复制构造函数的错误:
GCC 4.7 出现以下错误:
这应该被允许吗?我认为它没有被允许的技术障碍,但我目前手边没有标准......