技术开发 频道

Visual C++2010新特性:支持C++0x新标准

  auto 关键字

  C++ 标准为 auto 关键字定义了初始和修订的含义。在 Visual C++ 2010 之前,该关键字在自动存储类中声明变量,即具有局部生存期的变量。在C++ 0x 中,该关键字从声明的初始化表达式中可以推导出变量的类型。也就是说,在一个声明中使用了auto关键字,意味着“让它和初始化它的事物具有相同的类型”。下面我们可以举例说明:

  (1)自动推断变量类型

1
 

  上面代码中,定义变量j为int类型,由于0是int类型,所以可以推断出使用auto 关键字声明的变量k也是int类型。

  (2)声明更简洁

1
 

  上述声明有着相同的效果,由于使用auto 关键字,使得第二行的声明更加简洁。

  另外,跟其他数据类型一样,我们也可以对auto关键字进行修饰,例如添加const,指针(*),左值引用(&),右值引用(&&)等等,编译器会根据auto类型所代表的真正的数据来决定这些修饰的具体含义。

  为了兼容一些旧有的C++代码,我们可以使用/Zc:auto[-](/Zc:auto:编译器从其初始化表达式中推导声明的变量的类型; /Zc:auto-:编译器将该变量分配给自动存储类)编译器选项,来告诉编译器是采用auto关键字的原有定义还是在新标准C++0x中的定义。具体设置见下图:

1
 

  static_assert 声明

  在新标准C++0x中,加入了对静态断言的支持,引入关键字static_assert来表示静态断言。使用静态断言,我们可以在程序的编译时期检测一些条件是否成立,这个特性在调试模板函数的模板参数时特别有用。在编译的时候,模板函数实例化,这时我们就可以使用静态断言去测试模板函数的参数是否按照我们的设计拥有合适的值。

1
 

  constant-expression:能够转换成Boolean类型的整数常量表达式,如果这个表达式返回值为False,使用参数string –literal显示编译失败的信息;否则的话,该静态断言声明没有生效。

  string-literal:用来显示编译失败的消息

1
 

  上面代码中标红的部分,N<2就是constant-expression,"Kitten requires N < 2。"就是string-literal。在编译的时候,我们在主函数中实例化Kitten这个结构体,static_assert声明会测试参数N的值,当N的值不小于2时就会产生一个断言错误,并将相应的调试帮助信息输出到“错误列表”窗口中。用“1”去实例化Kitten这个结构体时,因为1<2,返回True,静态断言声明没有生效。但是,使用“3” 实例化Kitten这个结构体时,因为3<2,返回False,此时就会产生断言错误,并输出错误信息。见下图

1
 

          static_assert声明是在编译时进行处理,所以不会产生任何运行空间和时间上的开销,比assert宏具有更好的效率。  

0
相关文章