假设我们有这个类:
class X {
public:
explicit X (char* c) { cout<<"ctor"<<endl; init(c); };
X (X& lv) { cout<<"copy"<<endl; init(lv.c_); };
X (X&& rv) { cout<<"move"<<endl; c_ = rv.c_; rv.c_ = nullptr; };
const char* c() { return c_; };
private:
void init(char *c) { c_ = new char[strlen(c)+1]; strcpy(c_, c); };
char* c_;
};
这个示例用法:
X x("test");
cout << x.c() << endl;
X y(x);
cout << y.c() << endl;
X z( X("test") );
cout << z.c() << endl;
输出是:
ctor
test
copy
test
ctor <-- why not move?
test
我正在使用具有默认设置的 VS2010。我希望最后一个对象 ( z
) 是移动构造的,但事实并非如此!如果我使用X z( move(X("test")) );
,那么输出的最后几行是ctor move test
,正如我所料。它是(N)RVO的情况吗?
Q : move-ctor 应该按照标准调用吗?如果是这样,为什么不叫它?