C++ g++;正在中断std::filesystem::last_write_时间中的更改
在最近的操作系统升级中,我注意到我的代码有一小部分停止了编译——原因似乎是从C++ g++;正在中断std::filesystem::last_write_时间中的更改,c++,g++,c++17,C++,G++,C++17,在最近的操作系统升级中,我注意到我的代码有一小部分停止了编译——原因似乎是从g++-8切换到g++-9 此代码在g++8.3.0上编译正常(使用Dockerhub中的gcc:8.3图像验证) 编译命令:g++-std=c++17 test.cpp-lstdc++-fs(即使在上不需要链接stdc++-fs,因为g++9) 我的问题是——这个函数的惯用用法是什么?即将文件的最后写入时间更改为五分钟前 我知道,如果引入了突破性的更改,我会以某种非惯用的方式使用它。这一点被 你给一个std::chro
g++-8
切换到g++-9
此代码在g++8.3.0
上编译正常(使用Dockerhub中的gcc:8.3
图像验证)
编译命令:g++-std=c++17 test.cpp-lstdc++-fs
(即使在上不需要链接stdc++-fs
,因为g++9
)
我的问题是——这个函数的惯用用法是什么?即将文件的最后写入时间更改为五分钟前
我知道,如果引入了突破性的更改,我会以某种非惯用的方式使用它。这一点被
你给一个std::chrono::time\u点
从来都不是便携的;它只是碰巧在你以前的工具链上工作。这并不是你的错:你不可避免地依赖于实现细节
C++20引入了一种可移植的替代方案,因此您可以:
std::filesystem::last_write_time("test", std::chrono::file_clock::now() - 5min);
// ^^^^^^^^^^
…即,使用文件时钟
,而不仅仅是希望替代方案可以转换为工具链使用的任何实现定义的时钟
不过,GCC 9是否支持这一点我还不能确定。如果有一个解决方法,我不知道(这就是为什么C++20进行了更改)
正如@LightnessRacesinOrbit在他们的回答中指出的,
最后一次写入时间
使用了未指定的时间点
类型。这意味着从一个编译器移动到另一个编译器甚至同一个编译器的版本是完全合法的
不过,您可以做的是获取实现使用的时钟,然后自己使用它。被构建为将创建它的时钟类型作为模板参数,并且它呈现一个表示该类型的公共时钟类型。因此,为了便于携带时钟,现在就调用
,您可以使用
std::filesystem::last_write_time("test", std::filesystem::file_time_type::clock::now() - 5min);
// ^ give me whatever clock you use and call now on it
这是因为。@Barry该提案增加了改进的行为是的,但在没有该提案的情况下,实际问题是由于愚蠢的先前规范与纯粹的偶然性和工具链更新相一致!是的,不要不同意,只是添加信息。另外,gcc还没有声称在8中完成了C++17功能,所以ABI更改仍然是可能的。
std::filesystem::last_write_time("test", std::chrono::file_clock::now() - 5min);
// ^^^^^^^^^^
std::filesystem::last_write_time("test", std::filesystem::file_time_type::clock::now() - 5min);
// ^ give me whatever clock you use and call now on it