【发布时间】:2018-02-04 21:58:09
【问题描述】:
我编写了一个名为 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() 是一个临时值,所以调用了 move 构造函数,对吧?但是如果我尝试这种方式,它就不行了。
speak(Str("cat"));
它的输出是:
constructor
我不明白的是 Str("cat") 也是一个临时值。但它只调用构造函数!为什么??
【问题讨论】:
-
可以省略对复制和移动构造函数的调用。在这种情况下,临时对象没有绑定到引用,因此可以直接在目标中构造对象。
标签: c++ c++11 constructor rvalue-reference move-constructor