大佬教程收集整理的这篇文章主要介绍了c – 返回兼容类型时为什么需要显式的std :: move?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
struct A { A() = default; A(const A&) { std::cout << "copied" << std::endl; } A(A&&) { std::cout << "moved" << std::endl; } }; std::pair<A,A> get_pair() { std::pair<A,A> p; return p; } std::tuple<A,A> get_tuple() { std::pair<A,A> get_tuple_moved() { std::pair<A,A> p; return std::move(p); }
有了这个,以下电话:
get_pair(); get_tuple(); get_tuple_moved();
产生此输出:
@H_879_2@moved moved copied copied moved movedget_pair的结果是移动构建的,正如预期的那样. NRVO也可能完全消除了这一举动,但现在不在于这个问题.
get_tuple_moved的结果也是移动构造的,它被明确指定为这样.然而,get_tuple的结果是复制构造的,这对我来说是完全不明显的.
我认为传递给return语句的任何表达式都可以被认为是对它有隐含的动作,因为编译器知道它即将超出范围.好像我错了有人可以澄清,这里发生了什么?
另请参见相关但不同的问题:When should std::move be used on a function return value?
以上是大佬教程为你收集整理的c – 返回兼容类型时为什么需要显式的std :: move?全部内容,希望文章能够帮你解决c – 返回兼容类型时为什么需要显式的std :: move?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。