现代 C 的实验特性对于长期项目是否可靠?

新手上路,请多包涵

我有一个当前使用 C++1114 的项目,但它需要 std::filesystem 之类的东西,它仅在 C++17 中可用,因此我目前没有机会使用它.但是,我看到它在我当前的编译器中可用 std::experimental::filesystem 。假设我将来可以添加以下内容,那么使用实验性功能是否是个好主意:

 #ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif

我的担忧是:

1. 是否保证所有兼容的编译器都具有相同的实验特性?

2. 实验性功能是否容易发生大的变化而使其不可靠?

也许还有更多值得怀疑的事情。为什么我应该或不应该使用它们?我对一个新项目感到困惑,不知道该决定什么。

原文由 The Quantum Physicist 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 370
2 个回答
  1. 是否保证所有兼容的编译器都具有相同的实验功能?

不,实验性功能是可选的。

  1. 实验性功能是否容易发生大的变化而使其不可靠?

是的,C++ 委员会甚至可能决定放弃某个特性,或者在标准化过程中可能会出现一个缺陷,从而迫使特性发生变化。

一般来说,依赖实验特性并不是一个好主意。实验特征正是这个词所说的(即实验)。

原文由 101010 发布,翻译遵循 CC BY-SA 3.0 许可协议

“实验性”是一个稍微夸张的术语。 filesystem 库起源于 Boost,并在那里经历了几次迭代,然后才提交给 ISO。

但是,ISO 标准故意 非常 保守。称其为实验性意味着 ISO 明确不承诺命名将是稳定的。很明显,您将来需要重新处理您的代码。但是知道 ISO,很可能会有指导。

至于编译器之间的兼容性,期望它是合理的。但是会有一些极端情况(例如考虑 Windows 驱动器相对路径),这正是未来标准可能会破坏现有代码的原因。理想情况下,当且仅当您依赖那个极端情况时,它才会破坏您的代码,但这不是保证。

原文由 MSalters 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题