论坛首页 综合技术版 C++

C++ 0x的几个新特性 auto static_assert lambdas

浏览 228 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-08-05
首先是 auto

C++98的auto基本属于一个无用的关键字
在0x中 它被引入了新的语义
如下代码
    for (auto i = m.begin(); i != m.end(); ++i) {
        cout << i->second << " are " << i->first << endl;
    }

被auto声明的变量会被编译器看作它被初始化的那个变量 在某些时刻可以用用

其次是 static_assert
下面这样的代码
template <int N> struct Fib 
{ 
    enum 
    { 
        Val = Fib <N -1> ::Val   +   Fib <N   -2> ::Val 
    }; 

}; 

template   <>   struct   Fib <0> {enum   {Val   =   0};}; 
template   <>   struct   Fib <1> {enum   {Val   =   1};}; 

大家都应该不陌生了吧
但是如果我这么来呢
Fib<-1>::Val;

static_assert就是用来在编译期报出这样的错 而且是以用户定义的语句 不会是看起来让人头晕的编译器error
static_assert(N >= 0, "Fib <N> requires N >= 0.");

这样的代码 编译器会说
main.cpp(xxx): error Cxxxx: Fib <N> requires N >= 0.

而不是什么一大串fatal error阿

下来就是lambdas了
各位精通各种脚本的牛人可能已经非常的熟悉这个领域了 我就简单的说一下好了
int main() {
    vector<int> v;

    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }

    for_each(v.begin(), v.end(), [](int n) { cout << n << " "; });
    cout << endl;
}


下面是个稍微复杂点的例子 显示lambdas的返回值
int main() {
    vector<int> v;

    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }

    deque<double> d;

    transform(v.begin(), v.end(), front_inserter(d), [](int n) -> double {
        return n*1.0;
    });
}

感觉这个只是一些语法糖 我用函数对象照样可以完成的阿
而且lambda的调试应该怎么样做呢?
非常好奇MS和Gdb他们的实现
   
论坛首页 综合技术版 C++

跳转论坛:
JavaEye推荐