假设我们有这个类:
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: 根据标准,移动构造函数应该被调用吗?如果是,为什么没有被调用?
char *
。 - M.M-fno-elide-constructors
,这将关闭复制省略并调用移动构造函数。 - Nilesh Kumar