为什么我的C++移动构造函数未被调用?
问题描述:
我写了一个名为Str的简单类,并覆盖了它的构造函数,复制构造函数和移动构造函数。为什么我的C++移动构造函数未被调用?
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( “猫”)是一个临时的价值,以及。但它只是叫做构造函数!为什么??
答
我不明白的是Str(“猫”)也是一个临时值。但它只是叫做构造函数!为什么??
首先,绑定到引用不会导致复制,即不会调用复制/移动构造函数。
对于speak(Str("cat"));
,Str("cat")
是一个临时值,那么它将绑定到右值参考参数s
。不需要复制任何内容,则不需要调用复制/移动构造函数。
可以省略对复制和移动构造函数的调用。在这种情况下,临时不会绑定到引用,因此可以直接在目标中构建该对象。 –