7

我正在开发一种主要将 C++ 用于其核心组件的产品。尽管它使用 Visual C++ 作为 Windows 平台的主要编译器,并将其编辑器和调试器作为主要开发环境,但并未使用任何 Microsoft 特定技术。对于其他平台,它使用 gcc 进行编译。

我的代码库大量使用模拟右值引用(使用 Boost 移动库)、可变参数模板(使用 Boost 处理器),在某些情况下还使用表达式模板。

我很想切换到 C++11 以使用右值引用、完美转发、构造函数的默认和删除、可变参数模板以及 auto 和 decltype 来获得更简洁的代码库。

如果我这样做,我可能会对现有代码进行一些修改以简化它(使用模板别名和可能的 constexpr)。在这种情况下,我必须使用 mingw 切换到 Windows 平台的 gcc,因为 Visual Studio 没有实现默认和删除以及可变参数模板。此外,我必须切换到 gdb 作为调试器和不同的代码编辑器。

对我来说,在代码简单性和性能方面的好处看起来很大,但是稳定性、可用性(在某些平台上,例如 Android)、调试(从 Visual Studio 迁移到 gdb,因为我们有许多为 Visual Studio 调试器开发的可视化工具)和代码编辑器(与其说是大量模板代码,我没有发现太多使用自动完成、重构等,而且 Codelite、Codeblocks、QtCreator 与我们的构建系统配合得很好)是一些问题。

我想知道是否有任何中/大型项目(无论是商业项目还是开源项目)使用/打算使用上述任何 C++11 功能?进行这种迁移需要多少努力?

任何实践经验、技巧或智慧之言都会帮助我做出决定。

4

1 回答 1

7

首先:这取决于政策。

像所有技术一样,从有效的东西转换到新的东西本身就是一种风险。根据您的心态和对项目的批评,您接受的风险程度可能会有所不同(例如,我将 Clang 的树顶版本用于个人项目,但在工作中使用了成熟的 gcc)。

就个人而言,我建议不要一头扎进生产就绪的项目,而是对可行的功能进行零碎的选择。

你提到:

  • 右值引用和完美转发
  • default/delete
  • 可变参数模板
  • 类型推断 ( auto/ decltype)
  • 模板别名和constexpr

VC++11支持许多 C++11 特性。例如,您现在可以开始使用右值引用类型推断。如果我没记错的话,这些可以与 gcc 4.5.x 分支一起使用,它已经有一年多的历史了,非常好用。

您的列表中一个值得注意的缺席是lambdas,例如,VC++11 和 gcc 都支持它。

如果你想更进一步,那么你将不得不切换编译器和环境。由于您需要重新培训团队,因此付出的努力要大得多(就我个人而言,我在 mingw 上与 gdb 有过一些矛盾……)。

除非你有冒险精神,否则我建议现在挑选对两种编译器都有效的方法。不过,迁移始终是一种商业风险。

于 2012-04-06T08:03:29.057 回答