考虑以下类:
<code class="cpp">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_; };</code>
并且它的用法:
<code class="cpp">X x("test"); cout << x.c() << endl; X y(x); cout << y.c() << endl; X z( X("test") ); cout << z.c() << endl;</code>
输出是:
ctor test copy test ctor <-- why not move? test
在 VS2010 中,使用默认设置,人们会期望最后一个对象(z)是移动构造的而不是默认的 -建造的。使用 X z( move(X("test")) ) 会产生预期的输出:ctor move test。这可能是 NRVO 的情况吗?
是否应该根据 C 11 标准调用移动构造函数?如果是这样,为什么不调用它?
观察到的行为是由于复制省略造成的。编译器可以直接将临时对象构造到要复制/移动到的目标中,从而省略复制/移动构造函数和析构函数调用。
第 12.8 节中概述了可以应用复制省略的情况。 C 11 标准第 32 条:
在这种情况下,编译器能够省略临时 X(“test”)和目标 z 之间的复制或移动操作,从而产生观察到的行为。
以上是为什么在这种情况下我的 C 11 Move 构造函数没有被调用?的详细内容。更多信息请关注PHP中文网其他相关文章!