【 在 hl0737 的大作中提到: 】
: 好的,非常感谢您的回答,但是还有一点点小疑问想请教一下您。
: vector中的数据是存储在堆上的, 也就是动态创建的一块内存,vector中有一个指针指向这块内存
: 如get_cmp_files中的vector res,假设res中指向堆的指针为p_sub, 这块内存是buffer S
: ...................
这个理解是右值使用场景, 但不是发生在std::move 或 std::forward的调用,
这两个函数, 实际作用只是类型转换, 实际就是符号的语义解释在语言层面发生了变化,
并没有引起内存位置形态的变化, 你说的那些东西, 实际上,
是发生在移动拷贝构造过程。
另外, 你要理解 , 右值是值, 右值引用也不过是值引用,
而值的存在有多种多样, 场景的常量可以编码到机器代码里, 可以存在于常量数据区,
也可以存在于静态数据段, 堆上, 或者栈上。
而右值引用的存在只保证是这些内存地址资源的别名, 而无法锁定或者延长它们的生存期。
std::vector<std::string>&& get_cmp_files(const std::string& dir)
这个函数定义, 包括return中的move, 都只是让函数返回了一个右值引用,
这个右值实际引用的地址确实函数局部变量, 也就是函数局部的栈内存, 它的生存期在函数返回
就已经消亡了。
auto v = get_cmp_files("vvv");
这一句, 这个右值引用其实已经指向了失效内存。
合理的做法, 其实就是返回值就行
std::vector<std::string> get_cmp_files(const std::string& dir)
这个时候, 实际上return会生成临时对象, 发生右值引用向左值赋值导致的移动拷贝。
std::vector<std::string>& v = get_cmp_files("vvv");
我觉得这样接收(引用)这个对象就是可以的。
--
FROM 124.126.0.*