主题:[讨论]关于move constructor的一个问题
[em1][em1][em1]
首先大侠们请看我写的一段实验代码:
#include <iostream>
using namespace std;
struct A
{
int* a;
};
struct B
{
B(): b(new int(0))
{ cout<<"ordinary constructor called"<<endl; }
B(B&& bb)
{
cout<<"Move copy constructor (B) called"<<endl;
this->b = bb.b;
bb.b = nullptr;
}
B(A && aa)
{
cout<<"Move copy constructor (A) called"<<endl;
b = aa.a;
aa.a = nullptr;
}
B operator = (A && aa)
{
cout<<"Move assignment operator called"<<endl;
b = aa.a;
aa.a = nullptr;
}
int* b;
};
B ReturnB(); //返回一个B的对象
A ReturnA(); //返回一个A的对象
void main()
{
ReturnB();
B bb = ReturnA();
B cc = ReturnB();
}
B ReturnB()
{
B bb;
return bb;
}
A ReturnA()
{
A aa;
return aa;
}
我用VS2010编译执行后的输出结果是:
ordinary constructor called
Move copy constructor (A) called
ordinary constructor called
请按任意键继续. . .
输出的第一句说明我调用ReturnB的时候会调用一次ordinary constructor,
输出的第二句说明ReturnA返回值是一个右值,
输出的第三句,显然是我调用ReturnB的时候输出的。
那么,我的main函数里的第三句:B cc = ReturnB(); 调用了ReturnB()以后一定还要对cc进行初始化吧?可是,为什么没有任何输出?也就是说,为什么这一句没有调用我定义的任何一个constructor?
求大侠们指点迷津[em2]
首先大侠们请看我写的一段实验代码:
#include <iostream>
using namespace std;
struct A
{
int* a;
};
struct B
{
B(): b(new int(0))
{ cout<<"ordinary constructor called"<<endl; }
B(B&& bb)
{
cout<<"Move copy constructor (B) called"<<endl;
this->b = bb.b;
bb.b = nullptr;
}
B(A && aa)
{
cout<<"Move copy constructor (A) called"<<endl;
b = aa.a;
aa.a = nullptr;
}
B operator = (A && aa)
{
cout<<"Move assignment operator called"<<endl;
b = aa.a;
aa.a = nullptr;
}
int* b;
};
B ReturnB(); //返回一个B的对象
A ReturnA(); //返回一个A的对象
void main()
{
ReturnB();
B bb = ReturnA();
B cc = ReturnB();
}
B ReturnB()
{
B bb;
return bb;
}
A ReturnA()
{
A aa;
return aa;
}
我用VS2010编译执行后的输出结果是:
ordinary constructor called
Move copy constructor (A) called
ordinary constructor called
请按任意键继续. . .
输出的第一句说明我调用ReturnB的时候会调用一次ordinary constructor,
输出的第二句说明ReturnA返回值是一个右值,
输出的第三句,显然是我调用ReturnB的时候输出的。
那么,我的main函数里的第三句:B cc = ReturnB(); 调用了ReturnB()以后一定还要对cc进行初始化吧?可是,为什么没有任何输出?也就是说,为什么这一句没有调用我定义的任何一个constructor?
求大侠们指点迷津[em2]