我编写了一个名为Str的简单类,并覆盖了它的构造函数,复制构造函数和移动构造函数。
class Str
{
public:
Str(const char* s) :m_data(NULL)
{
printf("constructor\n");
int size = strlen(s) + 1;
m_data = new char[size];
strncpy_s(m_data, size, s, size);
}
Str(const Str &s)
{
printf("copy constructor\n");
int size = strlen(s.m_data) + 1;
m_data = new char[size];
strncpy_s(m_data, size, s.m_data, size);
}
Str(Str &&s)
{
printf("move constructor\n");
m_data = s.m_data;
s.m_data = NULL;
}
public:
char* m_data;
};
现在我有一个想要调用它的移动构造函数的函数:
void speak(Str &&s)
{
}
Str getStr()
{
Str s("cat");
return s;
}
如果我这样试试,可以调用移动构造函数。
speak(getStr());
它的输出是:
constructor
move constructor
这是因为getStr()是一个临时值,所以调用了移动构造函数,对吧?但如果我这样做,就不能。
speak(Str("cat"));
它的输出是:
constructor
我不明白的是Str(“cat”)也是一个临时值。但它只叫构造函数!为什么?
答案 0 :(得分:1)
我不明白的是Str(“cat”)也是一个临时值。但它只叫构造函数!为什么?
首先,绑定到引用不会导致复制,即不会调用复制/移动构造函数。
对于speak(Str("cat"));
,Str("cat")
是临时的,然后它绑定到rvalue-reference参数s
。没有什么需要复制,因此不需要调用复制/移动构造函数。