C++ 隐式构造
为什么有时不移动构造函数调用?测试移动语义:C++ 隐式构造,c++,c++11,C++,C++11,为什么有时不移动构造函数调用?测试移动语义: struct测试{ int-id; 测试(int id):id(id){ cout编译器被明确允许省略临时对象的副本(或移动)。基本上,对象是在预期有效结果的地方构造的。即使构造函数或析构函数有副作用,也允许省略 相关条款为第12.8款【类别副本】第31段: 当满足某些条件时,允许实现忽略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数有副作用。在这种情况下,实现将忽略的复制/移动操作的源和目标视为两个dif引用同一对象
struct测试{
int-id;
测试(int id):id(id){
cout编译器被明确允许省略临时对象的副本(或移动)。基本上,对象是在预期有效结果的地方构造的。即使构造函数或析构函数有副作用,也允许省略
相关条款为第12.8款【类别副本】第31段:
当满足某些条件时,允许实现忽略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数有副作用。在这种情况下,实现将忽略的复制/移动操作的源和目标视为两个dif引用同一对象的不同方式,该对象的销毁发生在两个对象在未经优化的情况下销毁的较晚时间。在以下情况下,允许省略复制/移动操作,称为复制省略(可以组合以消除多个副本):
可以使用复制省略的情况基本上是
返回临时变量或局部变量时,在return
语句中
在抛出临时变量或局部变量时,在中抛出表达式
复制临时对象的时间
按值捕捉对象时
12.8[类别副本]第31段列出了可省略副本的确切条件
防止复制/移动省略的最简单方法是将其传递给返回适当引用的函数,例如使用
f(std::move(Test(1)));
应该防止移动省略。第一步很可能被省略。你得到的是一个副本省略。我是唯一一个没有得到它的人吗?你的f
正在进行测试,而不是测试和,为什么你希望它会使用移动构造函数?@texasbruce:f
按值获取对象,对吗?但是暂时的de>测试(1)
作为一个右值,它将被移动构造成z
而不是复制,因为我们之前为它声明了移动构造函数——在很多情况下,这是我们喜欢在C++11中按值传递的要点。那么,为什么它不在这里应用于复制构造呢?——它遇到了第4种情况。@MM.:对象绑定到一个引用,该引用实际上在ibits复制省略,因为从临时对象复制/移动只能在它们未绑定到引用的情况下被省略(这在上述条款的细节中)……而“catching”指的是try/catch
块的catch(tx)
-子句:您的调用基本上与案例3匹配,除了std::move()
不返回临时引用,而是返回右值引用。
1 Test()
1 f(Test t) <---// where is move constructor ?!
1 ~Test()
2 Test()
2 Test(const Test &t) <---// copy constructor of t(2)
2 f(Test t)
2 ~Test()
2 ~Test()
f(std::move(Test(1)));