你可能不知道它是否是多余的检查__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初始化
