我试图理解在C11中移动构造函数和赋值操作的方式,但是我在委托父类时遇到问题.
代码:
class T0 { public: T0() { puts("ctor 0"); } ~T0() { puts("dtor 0"); } T0(T0 const&) { puts("copy 0"); } T0(T0&&) { puts("move 0"); } T0& operator=(T0 const&) { puts("assign 0"); return *this; } T0& operator=(T0&&) { puts("move assign 0"); return *this; } }; class T : public T0 { public: T(): T0() { puts("ctor"); } ~T() { puts("dtor"); } T(T const& o): T0(o) { puts("copy"); } T(T&& o): T0(o) { puts("move"); } T& operator=(T const& o) { puts("assign"); return static_cast<T&>(T0::operator=(o)); } T& operator=(T&& o) { puts("move assign"); return static_cast<T&>(T0::operator=(o)); } }; int main() { T t = std::move(T()); return 0; }
但是,当我在VS2012下编译并运行时,输出表示T0成员的左值版本被调用:
ctor 0 ctor copy 0 <-- move <-- dtor dtor 0 dtor dtor 0
移动分配发生类似的情况(测试用例略有不同) – T的移动分配运算符调用T0的“正常”赋值运算符.
我究竟做错了什么?