c – 移动构造函数和继承
发布时间:2020-12-16 05:44:23 所属栏目:百科 来源:网络整理
导读:我试图理解在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(
我试图理解在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的“正常”赋值运算符. 我究竟做错了什么? 解决方法
函数将rvalue引用作为参数的一个更令人困惑的事情是在内部将它们的参数视为左值.这是为了防止你在你的意思之前移动参数,但需要一些习惯.为了实际移动参数,你必须在其上调用std :: move(或std :: forward).所以你需要定义你的移动构造函数为:
T(T&& o): T0(std::move(o)) { puts("move"); } 您的移动分配运算符为: T& operator=(T&& o) { puts("move assign"); return static_cast<T&>(T0::operator=(std::move(o))); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 在Ruby on Rails中,渲染’shared / score
- xml – 播放框架记录器在打包后不选择格式
- c# – 任务并行库中的任务如何影响ActivityID?
- 【C#错误】未能添加对“LoginBLL”的引用,将此项目作为引用
- Flash GUI for Your EXE Using Minimalistic Approach
- 在dojo.dnd中禁用复制
- c# – 在ASP.NET MVC 5中将整个对象从视图传递到控制器
- c# – 静态方法线程是否安全
- DWR框架对于Ajax的轻量级使用
- Swift 3 dev快照中的POST请求给出了“对成员’dataTask的模