FDIS在附录C.2
“ C ++和ISO C ++ 2003”中有一个不兼容的部分。
总结,在这里对FDIS进行解释,以使其(更好)适合作为SO答案。我添加了一些自己的示例来说明差异。
我不完全了解与图书馆相关的一些不兼容问题,因此我将其留给其他人详细说明。
核心语言
#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"
#define _x "there"
"hello"_x // now a user-defined-string-literal. Previously, expanded _x .
新关键字:alignas,alignof,char16_t,char32_t,constexpr,decltype,noexcept,nullptr,static_assert和thread_local
某些大于long可以表示的整数文字可能会从无符号整数类型变为有符号long long。
使用整数除法的有效C ++ 2003代码将结果四舍五入为0或向负无穷大,而C ++ 0x始终将结果四舍五入为0。
(对于大多数人来说,确实不是兼容性问题)。
使用关键字auto
作为存储类说明符的有效C ++ 2003代码在C ++ 0x中可能无效。
缩小的转换会导致与C ++ 03不兼容。例如,以下代码在C ++ 2003中有效,但在此国际标准中无效,因为将double转换为int会缩小转换范围:
int x[] = { 2.0 };
当隐式定义的格式不正确时,隐式声明的特殊成员函数将被定义为删除。
在不需要定义的情况下(例如,在可能无法评估的表达式中),使用这些特殊成员函数之一的有效C ++ 2003程序格式错误。
我的例子:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
这样的sizeof技巧已被一些SFINAE使用,现在需要更改:)
用户声明的析构函数具有隐式异常规范。
我的例子:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
此代码terminate
在C ++ 0x中调用,但在C ++ 03中不调用。因为A::~A
C ++ 0x中的隐式异常规范是noexcept(true)
。
有效的C ++ 2003声明export
在C ++ 0x中格式错误。
一个有效的C ++ 2003表达式,包含>
紧随其后的表达式,>
现在可以视为关闭两个模板。
在C ++ 03中,>>
始终是移位运算符。
允许通过内部链接对函数进行依赖调用。
我的例子:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
在C ++ 03中,这会调用f(long)
,但在C ++ 0x中,这会调用f(int)
。应该注意的是,在C ++ 03和C ++ 0x中,以下调用f(B)
(实例化上下文仍仅考虑外部链接声明)。
struct B { };
struct A : B { };
template<typename T>
void g(T t) { f(t); }
static void f(A) { }
void f(B) { }
int main() { A a; g(a); }
f(A)
由于没有外部链接,因此未采用更好的匹配。
图书馆变更
使用添加到C ++ 0x的C ++标准库中的任何标识符的有效C ++ 2003代码可能无法在本国际标准中编译或产生不同的结果。
#includes
带有新C ++ 0x标准库标头名称的标头的有效C ++ 2003代码在此国际标准中可能无效。
预期已插入交换的有效C ++ 2003代码<algorithm>
可能必须包含<utility>
全局名称空间posix
现在保留用于标准化。
有效的C ++代码2003定义override
,final
,carries_dependency
,或noreturn
为宏是C ++ 0x中无效。
export
关键字的含义?我给我外套。