Rvalue绑定和移动的组合
Combination of Rvalue binding and moving
我必须遵循一段代码,我想知道标准对它有什么规定。它是未定义的行为、定义但未指定的行为还是定义良好的行为?
using namespace std;
struct Foo {
mutable int obj;
Foo(Foo&&) = default;
Foo(int arg) : obj(arg) {}
void f() const { obj *= 2; }
};
int main()
{
Foo&& a = Foo(5); // Binds temporary, lifetime ends with program
const Foo& b = a; // Binds a, lifetime ends with program
Foo c(std::move(a)); // Moves from a
// a now in defined, but unspecified state
b.f(); // ??
cout << b.obj << endl; // May output 10
return 0;
} // End of lifetime of temporary
注释以及我对标准的理解和解释是否正确?
move
从值(rvalue-ref构造,自然不调用std::move
)语义上看,意味着该值应该处于有效(特别是对销毁有效)但未指定的状态。
然而,C++中的move
并不具有魔力。这只是应该做的,而不是语言强迫你做的。
CCD_ 4作为基元";标量";类型实例与复制它没有什么不同。
move
类类型执行从源到目的地的每个组件的成员(和父)move
。
CCD_ 7只是表示";使用我的元素的移动构造函数";,它是int
,而int
的移动构造函数做。。。复制(好吧,int
的move构造函数不存在,但如果存在,它就会进行复制)。
move
的语义,即必须使源处于有效(最重要的是可销毁)状态,需要以合理的方式与std
容器和算法交互,这也是std
类型的行为方式。
所有这些都很好,但标准的支持在哪里?
当move
使用=default
时会发生什么?在这种情况下,类最终会出现以下子句:
[类别副本]/15.3
否则,使用x 的相应基或成员直接初始化基或成员
对于直接初始化,告诉如何从int&&
直接初始化int
的子句是:
[dcl.init]/17.8
否则,正在初始化的对象的初始值是ini初始化器表达式的值(可能已转换)。
第二表达式CCD_ 18的值为7。a
的值没有改变,因为标准不允许。
搬家不是魔法。
(引用当前标准草案n4296。)
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- MSVC将仅移动结构参数解释为指针
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 如何通过将特定的字符组合移动到空数组来"delete"单词和元音?
- Rvalue绑定和移动的组合
- C++ - 组合复制/移动运算符和构造函数
- 组合复制和移动的两个构造函数
- 如何通过一定的组合键+鼠标移动来调整窗口大小?(如 Linux 中的 Alt+F8)不要单击并拖动