我认为Nicolai可以说得更好一些。
当返回by时auto
,您的函数将返回一个值(将推导其类型)。如果std::invoke
返回纯rvalue或xvalue,则当然call
将相应地构造结果(如果可能,通过移动)。从这个意义上讲,我们不会“失去语义”。
但是,当我们按值返回时,需要创建该值对象。可以通过移动来创建它,并且在某些情况下(此处不存在)可以被删除,但是必须创建它。有保证的复制省略不允许我们退出创建此对象的过程。
如果std::invoke
给我们返回一个xvalue(对某物的rvalue引用),那将是非常浪费的。我们为什么要构造一个对象以返回它?
这就是为什么一两张幻灯片之后他说我们应该回去的原因decltype(auto)
。然后,推导规则将保留对以下调用的值类别std::invoke
:
如果它返回一个值,我们的情况不会更糟。我们自己call
将返回一个值(它可以通过移动的返回值来创建std::invoke
)。
如果std::invoke
返回一个左值(X&
)或左值()X&&
,则将按原样返回,而无需通过复制或移动来创建另一个对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句