C++11:基于范围的for循环、静态断言

基于范围的 for 循环

  C++ 11 加强了 for 语句的功能,以更好的支持用于遍历集合的 for_each 范式。在新的形式中,用户可以使用 for 去迭代遍历 C 风格的数组、初始化列表,以及所有非成员 begin()end() 被重载的容器。

  当你仅仅想获取集合/数组中的元素来做一些事情,而不关注索引值、迭代器或者元素本身的时候,这种for的形式非常有用。

void test1() {
	int a[] = { 1, 2, 3, 4, 5 };
	int n = sizeof(a) / sizeof(*a);

	for (int temp : a)
		cout << temp << " ";
}

  注意:使用基于范围的for循环,其for循环迭代的范围必须是可确定的

int func(int a[]){//形参中数组是指针变量,无法确定元素个数,数组作为参数进行传递时会退化为指针
    for(auto e: a){ // err, 编译失败
        cout << e;
    }
}

同时,如果想在遍历的过程中修改容器中的数据,应采取引用的方法

// & 启用了引用, 如果没有则对 arr 中的元素只能读取不能修改
for(auto &i : arr) {    
    std::cout << i << std::endl;
}

静态断言

  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(常量表达式,提示字符串)
    //注意:只能是常量表达式,不能是变量,毕竟是在编译阶段,变量没法确定
int main() {
    //该static_assert用来确保编译仅在32位的平台上进行,不支持64位的平台
    static_assert( sizeof(void *)== 4, "64-bit code generation is not supported."); 
    cout << "Hello World!" << endl;

    return 0;
}