怎么感觉c++11没多少新东西啊,我列出来大家看一看
模板相关的就不列出来了,可能对些基础库的人影响很大,但我们多数人只是使用模板,写模板的情况比较少,就列不涉及模板的。
1、右值引用:这个比较有用,在一些情况下可以减少一次内存拷贝,提高了效率。
2、泛化的常数表达式,更科学了,不是什么大的改动。
3、初始化形式的扩展:这个会带来一些方便
4、自动类型推导:不考虑模板的话,就是代码能看起来舒服一些
5、以范围为基础的for循环:早该有了,来得太晚,大家可能都用for each 了。
6、Lambda函数与表示式:也是千呼万唤,算一个实质性的改进
7、构造函数的改良:有意义的小改动
8、显示虚函数重载:可能有点用吧
9、空指针:无所谓了,大家都习惯NULL了。
10、强枚举类型:更规范些,有点用
11、变长参数模板:这个虽然涉及模板,但真的很有用,比如tuple那个例子。
12、无限制的union:有用,像是BUG修复
13、新的字符串常量表示法:还好
为什么不引入点函数式编程呢
元编程那些东西咱没搞过,那里才是模板最大的用武之地,所以模板的一些改动不是太清楚意义有多大
元编程什么时候成了模板最大的用武之地了?
一般人平时会用到的模版技术大都脱离不了c++ primer的范围
boost那种把模版用的出神入化的神技,懂是很好,不懂其实也没什么差
[解决办法]
核心语言特性我现在主要也就用这么多。自己对号入座吧。
C99 preprocessor(N1653) ;
Static assertions(N1720) ;
Right angle brackets(N1757) ;
long long(N1811) ;
Built-in type traits(N1836) ;
auto-typed variables(N1984) ;
Delegating constructors(N1986) ;
Extern templates(N1987) ;
Generalized constant expressions(N2235) ;
Variadic templates v0.9(N2242) ;
New character types(N2249) ;
Template aliases(N2258) ;
Declared type of an expression v1.0(N2343) ;
Defaulted and deleted functions(N2346) ;
Strongly-typed enums(N2347) ;
Null pointer constant(N2431) ;
Explicit conversion operators(N2437) ;
Unicode string literals(N2442) ;
Raw string literals(N2442) ;
Inline namespaces(N2535) ;
New function declaration syntax for deduced return types(N2541) ;
Initializer lists (N2672) ;
Non-static data member initializers (N2756) ;
Rvalue references v3.0(N3053) ;
Lambda expressions and closures v1.1(N2927) ;
Range-based for(N2930) ;
Converting Lambdas to Function Pointers(N3052) ;
Explicit virtual overrides v1.0(N3272) 。
[解决办法]
核心语言特性我现在主要也就用这么多。自己对号入座吧。
C99 preprocessor(N1653) 不明觉厉。。。C专有方面的个人用得少,谁知道就补充点。。。;
Static assertions(N1720) static_assert()编译期报错,一方面省了固定检查式报错可以拿到编译时完成(提高性能的同时也不降低程序质量),另一方面使用自定义的报错能使得报错信息更有意义;
Right angle brackets(N1757) template<... something< ... >>不用再写成template<... something< ... > >才没有编译问题的这么麻烦了;
long long(N1811) 至少64位的大整数。同样是能让64位宽的数据可以原生的编译而不用再浪费掉了,而之前是用短数据模拟的,即使处理器原生支持也得不到好处;
Built-in type traits(N1836) 没什么解释的必要了。。;
auto-typed variables(N1984) 这东西方便、但是增加编译时间,同时在某些场合有潜在的不确定性,另一些场合必不可少(例如后置返回型函数模板里用做返回型);
Delegating constructors(N1986) 可以在同一个类中允许构造函数间互相调用(但是前提是需要满足一些特殊规则),从而在某些地方实现降低设计难度开销、提高可读性;
Extern templates(N1987) 也是个提供方便的东东。。。;
Generalized constant expressions(N2235) 提高性能的东东(其实是减少没必要的运行时重复计算),谁还没想起来到底是什么?其实就是constexpr。。。;
Variadic templates v0.9(N2242) 模板的数学性递归问题需要的东东。没有支持的话会很蛋疼。。。;
New character types(N2249) 国际化大势所趋,光允许一个char类型做字符串使用,又老又破。。。;
Template aliases(N2258) 同样是增加可读性和降低设计难度的东西,而且还又增加了一种模板定义方式(谁不同意可再提问);
Declared type of an expression v1.0(N2343) 暂时没什么好说的。。。;
Defaulted and deleted functions(N2346) 提高程序质量的东西。其实很有用,但是估计很多人根本不重视。。。;
Strongly-typed enums(N2347) 本来就该有的东西,static const成员常数的写法非常不规范,另一方面经典枚举类型本身的作用域和类型转换问题也确实不好;
Null pointer constant(N2431) 不光是写法不同于NULL,而且还是一种独立的数据类型(NULL不能和nullptr相提并论);
Explicit conversion operators(N2437) 增加可能性的东西,但是没考虑清楚就用的话,就等着呵呵吧;
Unicode string literals(N2442) 国际化。。。;
Raw string literals(N2442) 。。。;
Inline namespaces(N2535) 又一个增加易用性的东西;
New function declaration syntax for deduced return types(N2541) 举棋不定啊。。。早干吗去了;
Initializer lists (N2672) 不管是看着还是用着都感到很无语。。但确实能解决一些以前解决不好的问题;
Non-static data member initializers (N2756) 也是暂时没什么好说的。。。;
Rvalue references v3.0(N3053) 必须的。。。也是早干吗去了的东西。。。;
Lambda expressions and closures v1.1(N2927) 有人说是Lisp,觉得更有用的地方其实还是设计代理和多线程相关的东西(只是就事论事的看法)。。。;
Range-based for(N2930) 看起来漂亮,却也是编译器反向依赖于标准库的东西;
Converting Lambdas to Function Pointers(N3052) 。。。;
Explicit virtual overrides v1.0(N3272) 其实还有一个final,后一个貌似对非virtual的场合也可以用。
if(thread_lock == -1)
return;
else
++thread_lock;
++thread_lock;
if(thread_lock == 0)
{
--thread_lock;
return;
}