这个语法为C样式数组和任何支持一个迭代器通过begin()和end()功能。这包括所有标准库容器类(包括std::string)和initialization_list(我们将在下一课盖)。你也可以让它为你的自定义类定义迭代器风格begin()和end()成员函数。如果你使用的是旧的类不支持begin()和end()成员函数,你可以写的自由站立的开始和结束(X)(x)的功能和语法仍然会工作。
static_assert
C + + 03提供了一个断言,允许在运行时测试断言。然而,对于模板的编程,有时很有用,可以测试断言在编译型。C + + 11提供了一个新的关键词为static_assert做编译期断言测试。
这可以让你做的事情一样,确保变量的大小是你所期待的:
1
static_assert(sizeof(int)>=4,“int需要4个字节来使用此代码”);
注意,因为static_assert是在编译时检查的,它不能被用于评估依赖于运行时的值假设。static_asserts主要用于检查大小的东西通过sizeof()或确定#定义的值在一定的范围内。
一个你能做的最有用的事情是static_assert断言是否你的编译器支持C + + 11检查是否__cplusplus值大于199711l:
1
static_assert(__cplusplus > 199711l,“程序需要C++编译器11能”);
你可能会怀疑是否有多余的检查__cplusplus由于编译器不支持static_assert将抛出一个编译错误,当他们到达static_assert线。答案是不是多余的,因为许多编译器(包括Visual Studio 2010)为C + + 11的部分支持,可能没有一个完整的C + + 11实现理解static_assert。在写作时,Visual Studio 2010就是在这种情况下:了解static_assert,但它留下__cplusplus设置199711l,因为它的C + +11的实施仍然是相当稀少的。