假设我们有此类:C++ 11移动的构造不叫,默认的构造优选
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的情况吗?
问题:应该按照标准调用move-ctor吗?如果是这样,为什么不叫?
它复制省略。如果复制失败,则会发生移动。为什么你的文章标题说“首选默认构造函数”?没有默认的构造函数被调用,并且没有任何东西被替代移动构造函数。它正在被完全消除。 –
自C++ 11以来,此代码将无法编译;字符串文字不能隐式转换为非const char *'。 –