C++11 引入了哪些重大变化?

What breaking changes are introduced in C++11?(C++11 引入了哪些重大变化?)
本文介绍了C++11 引入了哪些重大变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我知道C++11中至少有一个变化会导致一些旧代码停止编译:在标准库中引入explicit operator bool(),替换旧实例operator void*().诚然,这将破坏的代码可能是一开始就不应该有效的代码,但它仍然是一个破坏性的变化:曾经有效的程序不再有效.

还有其他重大变化吗?

解决方案

FDIS 在附录 C.2C++ 和 ISO C++ 2003"中有一个不兼容部分.

总结,在此处解释 FDIS,使其(更好)适合作为 SO 答案.我添加了一些我自己的例子来说明差异.

有一些与库相关的不兼容问题,我不完全知道其中的含义,因此我将这些问题留给其他人详细说明.

核心语言

<小时>

#define u8 "abc"const char *s = u8"def";//以前是abcdef",现在是def"

<小时>

#define _x "那里""hello"_x//现在是用户定义的字符串文字.以前,扩展 _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();};结构 B : A { };int main() { sizeof B();/* 在 C++03 中有效,在 C++0x 中无效 *
                
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

What do compilers do with compile-time branching?(编译器如何处理编译时分支?)
Can I use if (pointer) instead of if (pointer != NULL)?(我可以使用 if (pointer) 而不是 if (pointer != NULL) 吗?)
Checking for NULL pointer in C/C++(在 C/C++ 中检查空指针)
Math-like chaining of the comparison operator - as in, quot;if ( (5lt;jlt;=1) )quot;(比较运算符的数学式链接-如“if((5<j<=1)))
Difference between quot;if constexpr()quot; Vs quot;if()quot;(“if constexpr()之间的区别与“if())
C++, variable declaration in #39;if#39; expression(C++,if 表达式中的变量声明)