运行时测试断言

来源:互联网 发布:指纹考勤机数据恢复 编辑:程序博客网 时间:2024/06/05 09:26
这个语法为C样式数组和任何支持迭代器通过begin()和()函数。这包括所有的标准模板库的容器类(包括std::string)和initialization_list(我们将在下一课盖)。你也可以让它为你的自定义类定义迭代器风格begin()和()成员函数。如果你使用的是旧的类不支持begin()和()成员函数,你可以写自由站立开始(x)和结束(x)的功能和语法仍然会工作。
static_assert
C++ 03提供assert宏允许在运行时测试断言。然而,对于模板编程,有时很有用,能够测试断言在编译型。C++提供了一种新的关键词为11 static_assert做编译期断言测试。
这可以让你做的事情,如确保变量的大小是你所期望的:

static_assert(sizeof(int)> = 4,“int需要4个字节来使用此代码”);
注意,因为static_assert是在编译时检查的,它不能被用来评估依赖于运行时的值假设。static_asserts主要用于检查大小事情都通过sizeof()或确定#定义的值在一定的范围内。
一个你可以做的最有用的事情是static_assert断言是否你的编译器支持C++ 11检查是否__cplusplus值大于199711l:

static_assert(__cplusplus > 199711l,“程序需要C++编译器11能力”);

你可能不知道它是否是多余的检查__cplusplus由于编译器不支持static_assert将抛出一个编译错误,当他们到达static_assert线。答案是,它是不是多余的,因为许多编译器(包括Visual Studio 2010)有C++ 11部分的支持,可能没有一个完整的C++实现理解static_assert 11。在写作时,Visual Studio 2010是在这种情况下:了解static_assert,但它留下的__cplusplus设置199711l,因为它是C++ 11实现仍然相当稀少。

自里没有initializer_list构造函数,它会检查是否有构造函数的参数类型(int,float)。里,以便调用构造函数。
虽然它最初看起来像是统一的初始化语法,总是比标准的构造函数语法更可取,但有两种情况下,可以提供不同的结果:


std::vector <国际> V1(8);//创建一个大小为8的空向量,使用int构造函数
std::vector > < int v1 { 8 };//创建数据价值8一一元向量,利用initializer_list构造函数
这是因为initializer_list构造函数优先于其他构造函数初始化时做的统一。
您还可以在函数调用或返回值时使用统一的初始化语法:

无效usemystruct(MyStruct X)
{
}
usemystruct({ 2,3.5f });//使用统一的初始化创建里隐
里makemystruct(void)
{
返回{ 2,3.5f };//使用统一的初始化创建里隐
}
初始化列表与初始化列表
的名字“初始化列表”的选择是不幸的,因为它得到“初始化列表”混淆起来非常容易,这是一个类似的概念。这里的区别:
初始化列表用于对类变量做隐式赋值,作为构造函数的一部分:

MyStruct(int x,浮y):m_nx(x),m_ny(Y){ };// m_nx和m_ny是初始化列表的一部分
一个初始化列表是一个列表的初始化括号({ })可以用来初始化简单聚合数据类型和类实现std::initializer_list:

std::vector < in> VARRAY = { 3,2,7,5,8 };//动态数组使用initializer_list初始化

1 0