C++11:基于范围的for循环、静态断言
C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages -- C++成为C++语言新标准。
C++11是对目前C++语言的扩展和修正, C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL) ,并入了大部分的C++ Technical Report 1(TR1) 程序库(数学的特殊函数除外)。
C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、 decltype,和模板的大量改进。
基于范围的for循环
在C++中for循环可以使用基于范围的for循环,示例代码如下:
int a[] = { 1, 2, 3, 4, 5 };
int n = sizeof(a) / sizeof(*a); //元素个数
for (int i = 0; i < n; ++i)
{
int tmp = a[i];
cout << tmp << ", ";
}
cout << endl;
for (int tmp : a)
{
cout << tmp << ", ";
}
cout << endl;
for (int i = 0; i < n; ++i)
{
int &tmp = a[i];
tmp = 2 * tmp;
cout << tmp << ", ";
}
cout << endl;
for (int &tmp : a)
{
tmp = 2 * tmp;
cout << tmp << ", ";
}
cout << endl;
使用基于范围的for循环,其for循环迭代的范围必须是可确定的:
int func(int a[])//形参中数组是指针变量,无法确定元素个数
{
for(auto e: a) // err, 编译失败
{
cout << e;
}
}
int main()
{
int a[] = {1, 2, 3, 4, 5};
func(a);
return 0;
}
静态断言
C/C++提供了调试工具assert,这是一个宏,用于在运行阶段对断言进行检查,如果条件为真,执行程序,否则调用abort()。
int main()
{
bool flag = false;
//如果条件为真,程序正常执行,如果为假,终止程序,提示错误
assert(flag == true); //#include <cassert>或#include <assert.h>
cout << "Hello World!" << endl;
return 0;
}
C++ 11新增了关键字static_assert,可用于在编译阶段对断言进行测试。
静态断言的好处:
- 更早的报告错误,我们知道构建是早于运行的,更早的错误报告意味着开发成本的降低
- 减少运行时开销,静态断言是编译期检测的,减少了运行时开销
语法如下:
static_assert(常量表达式,提示字符串)
注意:只能是常量表达式,不能是变量12
int main()
{
//该static_assert用来确保编译仅在32位的平台上进行,不支持64位的平台
static_assert( sizeof(void *)== 4, "64-bit code generation is not supported.");
cout << "Hello World!" << endl;
return 0;
}