侃侃无极
在的情况下return std::move(foo);的move是多余的,因为12.8 / 32:当满足或将满足复制操作的省略标准时,除了源对象是函数参数这一事实,并且要复制的对象由左值指定,重载决策选择复制的构造函数是首先执行,好像对象是由右值指定的。return foo;是NRVO的案例,因此允许复制省略。foo是一个左值。所以从选择“复制”构造foo到的返回值meh必须是移动构造函数(如果存在)。但是,添加move会产生潜在的影响:它可以防止移动被忽略,因为return std::move(foo);它不符合NRVO的条件。据我所知,12.8 / 32列出了左移的副本可以被移动替换的唯一条件。一般情况下,编译器不允许在复制后检测左值未使用(比如使用DFA),并自行进行更改。我在这里假设两者之间存在可观察到的差异 – 如果可观察行为相同则应用“假设”规则。因此,要回答标题中的问题,请在std::move需要移动时使用返回值,并且无论如何都不会移动。那是:你希望它被移动,并且它是一个左值,而且它不符合复制条款的条件,并且它不是按值函数参数的名称。考虑到这是非常繁琐而且移动通常很便宜,您可能会想说在非模板代码中您可以简化这一点。使用std::move时间:你希望它被移动,并且它是一个左值,而且你不能担心它。通过遵循简化的规则,你牺牲了一些移动省略。对于std::vector那些移动便宜的类型,你可能永远不会注意到(如果你注意到你可以优化)。对于std::array移动成本昂贵的类型,或者你不知道移动是否便宜的模板,你更有可能担心它。
版权声明:本文为weixin_28340315原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。