push_back()的怪异行为,将filesystem :: path的.string()。data()结果转换为“ vector ”

问题描述 投票:1回答:1

运行该程序

#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“ a.o”的第一个元素?

[我尝试在A行中断,发现当“ b.o”被push_back()转换为argv时,argv的第一个元素改变从“ a.o”变为“ b.o”。

然后,当我将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()之间的区别吗?

运行此程序#include #include #include 使用命名空间std;命名空间fs =文件系统; int main(){vector <:path>path {“ a.o” ...

c++ string vector char std-filesystem
1个回答
2
投票

问题是the path::string() function返回字符串按值

© www.soinside.com 2019 - 2024. All rights reserved.