运行这个程序
#include <iostream>
#include <filesystem>
#include <vector>
using namespace std;
namespace fs = filesystem;
int main() {
vector<fs::path> paths{"a.o", "b.o"};
vector<const char *> argv{};
for (auto &p : paths) {
argv.push_back(p.string().data()); // line A
}
argv.push_back(paths[0].string().data());
argv.push_back(paths[1].string().data());
for (auto &s : argv) {
cout << s << endl;
}
return 0;
}
得到
b.o
b.o
a.o
b.o
为什么 argv 的第一个元素不是“ao”?
我尝试在 A 行中断,发现当“bo”是 push_back() 进入 argv 时,argv 的第一个元素从“ao”变为“bo” 。
然后,当我将 A 行更改为
argv.push_back(p.string().c_str()); // line A: .string().data() -> .string().c_str()
结果相同。
当我将 A 行更改为
argv.push_back(p.c_str()); // line A: .string().data() -> .c_str()
突然我得到了预期的结果:
a.o
b.o
a.o
b.o
有人可以解释奇怪的行为以及 .string().data() 和 .c_str() 之间的区别吗?