我有一个功能
struct foo {
std::vector<int> v;
};
foo func();
从函数返回时, foo中的向量会被移动或复制吗?
它将被移动。(*)
由于您没有为您的foo
类提供显式移动构造函数,编译器将为您隐式生成一个为您的类的所有成员调用移动构造函数(如果可用)。由于std::vector
定义了一个移动构造函数,它将被调用。
根据 C++11 标准的第 12.8/15 段:
非联合类 X 的隐式定义的复制/移动构造函数执行其基类和成员的成员复制/移动。[...]
另请注意,当按值返回对象时,允许编译器省略对类的复制/移动构造函数的调用。这种优化称为(命名)返回值优化。
(*)我在这里假设您的用例是创建一个内部具有自动存储的本地对象foo()
并将其返回。