您的位置:首页 > 编程语言 > C语言/C++

C++11特性乱弹

2014-01-26 19:55 330 查看
C++的创始人Bjane Stroustrup说C++11感觉起来像一个新的语言。的确如此,这次不是炒冷饭,干货还是不少的。

auto自动类型检测

auto是C语言特傻的一茬。auto原来用来修饰一个局部变量,说明这个变量是栈上分配的,可自动销毁。但是局部变量默认就是auto类型的,几乎没有人会花那劲在前面主动加个auto,所以这个关键字算是浪费掉了。C++11赋予了这个关键字其他的意义,用来自动检测类型,以后我们就可以这么定义变量了:

·      auto x = 7;

·      auto y = 3.145;

·      auto z = Z{12};

auto在C++11程序中注定是要泛滥的。说不定不久的将来Java也要来一份,不过这都是互相抄的,人家Java早就有类似写法for(auto x : v) cout << x << ‘\n’;

lambda匿名表达式

这年头,似乎不支持lambda的语言和高上大就不沾边。这不,C++11中也整起来了,以后std::sort可以这样用了std::sort(v.begin(),v.end(), [](int a, int b) { return abs(a) < abs(b); });

C++11现在可以理直气壮地说哥不光OOP,连函数式编程的范儿都十足了,看不仅有lambda,还有variadic template,再看看咱的std::bind,啥都有。

static_assert编译时断言

还记得boost中的BOOST_STATIC_ASSERT吗,

#define BOOST_STATIC_ASSERT( B ) \
   typedef ::boost::static_assert_test<\

      sizeof(::boost::STATIC_ASSERTION_FAILURE<(bool)( B )>)>\

         BOOST_JOIN(boost_static_assert_typedef_,__COUNTER__)

编译时断言绝对是糟糕的hack,并且大多数断言失败的错误提示消息也莫名其妙。现在好了,C++11标准库中有了这玩意,我们再也不用关心是要通过模板特化还是通过其他方式来实现编译时断言了。真希望老大哥C语言这方面也能给力点,别老依赖蓝色小药丸。

static_assert还有几个兄弟,constexpr,alignof,都是好样的。

move semantics

用Google翻译的结果是“移动语义”,我倒觉得这像是割地赔款,把自己的东西移交给别人,叫“割让语义”更贴切。

虽说发明这玩意儿主要是用来避免临时变量的拷贝,但是随着使用泛滥,非临时变量肯定也不甘掉队,是不是来个std::move把自己伪装成临时变量,然后大家一起唱:“我把心交给你!”

最倒霉的还是指针爷爷,以后的时尚就是大家都装成临时变量传值了,指针爷爷只能在后台给大家擦皮鞋,因为就连它自有领域,大部分也被unique_ptr和shared_ptr替代了。

其实

其实语言就像是白米饭,要做到百吃不腻,不能啥料都往上放。扬州炒饭好吃吧,老干妈炒饭好吃吧,那也不能天天吃。

想知道更多C++11特性请参看BjaneStroustrup师傅写的C++11 faq。据说C++14也快来了,看来从Chrome开始飚版本以来,大家都喜欢跳数字博眼球了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++11