我已经写了一个测试课,但我没有理解发生了什么!。
移动/复制是否被删除?如果是这样,如何用新值更新它。我肯定错过了一些东西。
这是测试用例(请不要考虑有用性)
#include<iostream>
struct Test
{
int a;
Test(){a = 10;std::cout<<"def\n";}
Test(int a){this->a = a;std::cout<<"unary\n";}
Test(const Test& a){this->a = a.a; std::cout<<"copy\n";}
Test(Test&& a){this->a = a.a; std::cout<<"Move\n";}
Test& operator=(const Test& a){this->a = a.a;std::cout<<"op=\n";}
Test& operator=(Test&& a){this->a = a.a;std::cout<<"Move=\n";}
void display(){std::cout << "Display ";}
};
Test gi(Test a)
{
std::cout<<a.a<<"&\n";
return a;
}
int main()
{
//Test a = 99;
//Test();
/*Line MST*/ Test b = Test(102);//gi(a);
std::cout<<b.a<<'\n';
return 0;
}
这里线MST是我不明白的。如果我使用临时Test
对象初始化它应该不调用Move构造函数(或至少是副本)?
输出是:
unary
102
与此行类似的输出
Test b = gi(Test(103));
这里在调用gi()时没有发生移动/复制?
但这是我所期待的
Test a = 99;
Test b = gi(a);
我在这里缺少什么?
答案 0 :(得分:3)
移动/复制是否被删除?如果是这样,如何使用新值
进行更新
是的,根据C ++ 11标准的第12.8 / 31条,该副本被删除。完全取决于编译器何时以及是否执行此优化,并且您不应期望它正在执行或不执行(即使复制构造函数或移动构造函数具有副作用)。