不会。
auto v = get_cmp_files("cmp");
等价于
std::vector<std::string> && v = get_cmp_files("cmp");
v是个引用,不是个值类型的变量,不会调用任何构造。
如果写成
std::vector<std::string> v = get_cmp_files("cmp");
就会调用std::vector的move构造,但是move的是栈上已经销毁的变量,还是会崩
所以这个问题就是不能引用某个函数内的栈上的临时变量,不能返回这个变量的引用、右值引用、指针等拿来用。
不想复制大量数据,改函数定义,用常规搞法:
std::vector<std::string> get_cmp_files(const std::string& dir);
void get_cmp_files(const std::string& dir, std::vector<std::string> &files);
bool get_cmp_files(const std::string& dir, std::vector<std::string> &files);
【 在 hl0737 的大作中提到: 】
: 您好, 谢谢您的回答.
: 您的回答中提到, 只有把这个右值引用传给一个移动构造、移动赋值函数时,才会发生数据转移。
: 我是这样想的, 在get_cmp_files这个子函数中, 返回vector&&, 在主函数中用auto v = get_cmp_files("cmp");中的v变量接住, 我理解这时候会调用vector的移动构造函数, 从而让v的堆直接指向get_cmp_files函数中的res堆, 避免值语义的复制构造.
: ...................
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*