移动语义和结构

yng*_*ccc 7 c++ c++11

我有一个功能

struct foo {
    std::vector<int> v;
};

foo func();
Run Code Online (Sandbox Code Playgroud)

从函数返回时,foo中的向量是否会被移动或复制?

And*_*owl 8

它会被移动.(*)

由于您没有为您的foo类提供显式移动构造函数,因此编译器将隐式生成一个为您调用类的所有成员的移动构造函数(如果可用).由于std::vector定义了一个移动构造函数,因此将调用它.

根据C++ 11标准的第12.8/15段:

非联合类X的隐式定义的复制/移动构造函数执行其基础和成员的成员复制/移动.[...]

另请注意,在按值返回对象时,允许编译器忽略对类的复制/移动构造函数的调用.此优化称为(命名)返回值优化.

(*)我在这里假设您的用例是创建一个内部自动存储的本地对象foo()并将其返回.