我对移动语义的理解是你应该将函数的参数声明为按值,但是当你对拥有一个对象感兴趣时,可以调用std::move
。这使编译器可以决定是否应该复制或移动对象。
当您只对对象的内容感兴趣时,如何允许编译器进行类似的优化,而不会对容器或其元素进行不必要的复制。因此,例如,如果我有一些函数,它接受3个对象的数组并将它们存储在自己的容器中,我如何让编译器决定是否应该移动或复制元素?
class foo {
std::vector<BigObject> objects;
public:
void set_objects(std::array<BigObject, 3> input) {
// Store the input's elements in the objects vector
}
};
我读到了std::make_move_iterator
,但我不确定这是否会影响移动以及这会如何影响输入或输入参数的定义方式。
例如set_objects
的身体是这样的:
objects = std::vector<BigObject>(
std::make_move_iterator(input.begin()),
std::make_move_iterator(input.end())
);
我相信objects
现在是一个包含input
元素的向量,而input
现在将为空。如果input
是xvalue,但是签名将input
声明为by-value,那么即使它是xvalue也是如此,因为我无法移动实际的容器,只是它的元素
我可以将input
声明为引用以防止复制,但如果std::make_move_iterator
迫使移动,如果input
是左值,可能会产生副作用吗?
在输入我的问题之后,我相信答案是使用xvalue和by-reference签名重载set_objects
,前者移动input
的元素,后来复制input
' s元素,但我没有足够的信心说这是正确的解决方案。