是否存在将C++方言更改为C++ 11的风险,但是在XCode4上保留标准库非C++ 11?

Car*_*arl 1 c++ compiler-construction clang c++11

假设我有一个不使用任何C++ 11的跨平台(Win和Mac)生产代码库.

假设mac上的编译器选项已更改为使用C++ 11语言方言,但没有C++ 11标准库.

我已经尝试用谷歌搜索来了解可能的含义,但我的空洞.

我的问题是:

  1. 改变俚语中的语言方言甚至意味着什么?
  2. 做这样的事有什么风险?

Ste*_*sop 5

我不使用XCode,但我想如果他们为clang运送一个(可能是不完整的但到达那里)C++ 11模式,那么他们也发布了一个(可能是不完整的但是到达那里)C++ 11标准图书馆.并一起测试它们.所以你的情况不应该出现,但无论如何都假设:

  1. 在形式上它并不意味着什么,因为标准不承认混合和匹配"语言"和"库"的任何方式.这取决于你的编译器它认为它意味着什么.可能意味着新的"语言特征"如rvalue引用,lambdas等变得可用,但命名空间中的新类和函数std却没有.

  2. 主要风险可能是您不再按照公认的标准进行编程,而是编程编译器发明的可能未充分记录的事物.如果编译器说在C++ 11模式下它需要一个C++ 11标准库,并且你提供了一个C++ 03标准库,那么你甚至没有责备编译器文档 - 任何可能发生了,你打破了它,你的错.

除了这种有趣组合的风险之外,在使用C++ 03代码库并使用任何 C++ 11编译器编译它时存在小风险.C++ 03中有一些代码构造,它们编译为C++ 11但具有微妙(或严重)不同的含义.

例如,它几乎可以在C++ 03中编写一个在C++ 11中使用时会中断的类,因为C++ 11将生成一个不能正常运行的移动构造函数.有时你必须替换编译器生成的复制构造函数,它不能做正确的事情(Rule of Three),而C++ 11确保在那些"正常"情况下移动构造函数被抑制,有一些奇怪的边缘案例.不幸的是,我现在记不住了.

C++ 11标准列出了C++ 11和C++ 03之间的一些不兼容性.你希望所有人,但你知道它是怎么回事.该清单见附录C.首先是:

有效的C++ 2003代码可能无法编译或在本国际标准中产生不同的结果.具体而言,命名宏R,u8,u8R, u,uR,U,UR,或LR将不被扩大时邻近于一个字符串但将被解释为字符串文字的一部分.

从那里开始读书并没有那么多.但它基本上是一个列表,如果它们出现在你的C++ 03代码库中,需要改变以获得等效的C++ 11.