【发布时间】:2013-08-24 12:16:39
【问题描述】:
我正在编写标准 c++ 库的实现以供学习。
C++11 标准规定 for_each 返回 std::move(f)。
template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);
Returns: std::move(f).
我认为函数作用域局部变量在返回时是移动构造的。
我应该明确返回move(f) 吗?
【问题讨论】:
-
在这种情况下,返回
std::move(f)几乎等同于返回f。 C++11 禁止函数参数的返回值优化(但仍允许对它们进行隐式移动)。因此,在我看来,唯一的区别是return f;会退回到将其视为左值,如果右值会导致重载歧义或找不到构造函数。但是return move(f)在这种情况下会因格式错误而失败。 -
例如,对于像
struct Function { Function(Function&); };这样定义的Function,行为会有所不同。此类没有移动构造函数和不接受右值的复制构造函数。因此,move(f)返回格式错误,而return f;格式正确。 -
但话又说回来,我不确定函数对象的库约束是什么。也许他们需要
Function从右值复制初始化。据我所知,在这种情况下确实没有区别。 -
谢谢。
std::for_each要求Function为MoveConstructible但不是CopyConstructible,因此返回move(f)用于强制Function为MoveConstructible。检查不可移动类,如果我返回move(f),则会发生编译错误。
标签: c++ c++11 std move-semantics c++-standard-library