什么是网站功能,wordpress 在线skype,app生成链接,陕西交通建设集团网站体检C11 中值得关注的几大变化 1.Lambda 表达式 Lambda表达式来源于函数式编程#xff0c;说白就了就是在使用的地方定义函数#xff0c;有的语言叫“闭包”#xff0c;如果 lambda 函数没有传回值(例如 void )#xff0c;其回返类型可被完全忽略。 定义在与 lambda 函数相同作…C11 中值得关注的几大变化 1.Lambda 表达式 Lambda表达式来源于函数式编程说白就了就是在使用的地方定义函数有的语言叫“闭包”如果 lambda 函数没有传回值(例如 void )其回返类型可被完全忽略。 定义在与 lambda 函数相同作用域的变量参考也可以被使用。这种的变量集合一般被称作 closure闭包。表达式的简单语法如下 char s[]Hello World!; int Uppercase 0; //modified by the lambda for_each(s, ssizeof(s), [Uppercase] (char c)
{ if (isupper(c)) Uppercase; }); cout Uppercase uppercase letters in: s endl; View Code 在传统的STL中for_each() 这个玩意最后那个参数需要一个“函数对象”所谓函数对象其实是一个class这个class重载了operator()于是这个对象可以像函数的式样的使用。实现一个函数对象并不容易需要使用template比如下面这个例子就是函数对象的简单例子实际的实现远比这个复杂 template class T
class less {
public: bool operator()(const Tl, const Tr)const { return l r; }
}; View Code 所以C引入Lambda的最主要原因就是1可以定义匿名函数2编译器会把其转成函数对象。相信你会和我一样会疑问为什么以前STL中的ptr_fun()这个函数对象不能用ptr_fun()就是把一个自然函数转成函数对象的。原因是ptr_fun() 的局限是其接收的自然函数只能有1或2个参数。 那么除了方便外为什么一定要使用Lambda呢它比传统的函数或是函数对象有什么好处呢我个人所理解的是这种函数之年以叫“闭包”就是因为其限制了别人的访问更私有。也可以认为他是一次性的方法。Lambda表达式应该是简洁的极私有的为了更易的代码和更方便的编程。 2.自动类型推导 auto 在在这一节中原文主要介绍了两个关键字 auto 和 deltype示例如下 auto x0; //x has type int because 0 is int auto ca; //char auto d0.5; //double auto national_debt14400000000000LL;//long long auto 最大的好处就是让代码简洁尤其是那些模板类的声明比如STL中的容器的迭代子类型。 vectorint::const_iterator ci vi.begin(); 可以变成 auto ci vi.begin(); 模板这个特性让C的代码变得很难读不信你可以看看STL的源码那是一个乱啊。使用auto必需一个初始化值编译器可以通过这个初始化值推导出类型。因为auto是来简化模板类引入的代码难读的问题如上面的示例iteration这种类型就最适合用auto的但是我们不应该把其滥用。 比如下面的代码的可读性就降低了。因为我不知道ProcessData返回什么int? bool? 还是对象或是别的什么这让你后面的程序不知道怎么做。 auto obj ProcessData(someVariables); 但是下面的程序就没有问题因为pObject的型别在后面的new中有了。 auto pObject new SomeTypeOtherType::SomeOtherType(); 3.自动化推导 decltype 关于 decltype 是一个操作符其可以评估括号内表达式的类型其规则如下 如果表达式e是一个变量那么就是这个变量的类型。如果表达式e是一个函数那么就是这个函数返回值的类型。如果不符合1和2如果e是左值类型为T那么decltype(e)是T如果是右值则是T。原文给出的示例如下我们可以看到这个让的确我们的定义变量省了很多事。 1 2 3 const vectorint vi; typedef decltype (vi.begin()) CIT; CIT another_const_iterator; 还有一个适合的用法是用来typedef函数指针也会省很多事。比如 decltype(myfunc) pfunc 0; typedef decltype(A::func1) type; 4.auto 和 decltype 的差别和关系 Wikipedia 上是这么说的关于decltype的规则见上 #include vector int main() { const std::vectorint v(1); auto a v[0]; // a 的类型是 int decltype(v[0]) b 1; // b 的类型是 const int, 因为函数的返回类型是 // std::vectorint::operator[](size_type) const auto c 0; // c 的类型是 int auto d c; // d 的类型是 int decltype(c) e; // e 的类型是 int, 因为 c 的类型是int decltype((c)) f c; // f 的类型是 int, 因为 (c) 是左值 decltype(0) g; // g 的类型是 int, 因为 0 是右值 } 如果auto 和 decltype 在一起使用会是什么样子能看下面的示例下面这个示例也是引入decltype的一个原因——让C有能力写一个 “ forwarding function 模板” template typename LHS, typename RHS auto AddingFunc(const LHS lhs, const RHS rhs) - decltype(lhsrhs) {return lhs rhs;} 这个函数模板看起来相当费解其用到了auto 和 decltype 来扩展了已有的模板技术的不足。怎么个不足呢在上例中我不知道AddingFunc会接收什么样类型的对象这两个对象的 操作符返回的类型也不知道老的模板函数无法定义AddingFunc返回值和这两个对象相加后的返回值匹配所以你可以使用上述的这种定义。 5.统一的初始化语法 C/C的初始化的方法比较C 11 用大括号统一了这些初始化的方法。 比如POD的类型。 1 2 int arr[4]{0,1,2,3}; struct tm today{0}; 关于POD相说两句所谓POD就是Plain Old Data当class/struct是极简的(trivial)、属于标准布局(standard-layout)以及他的所有非静态non-static成员都是POD时会被视为POD。如 1 2 3 struct A { int m; }; // POD struct B { ~B(); int m; }; // non-POD, compiler generated default ctor struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m POD的初始化有点怪比如上例new A; 和new A(); 是不一样的对于其内部的m前者没有被初始化后者被初始化了不同 的编译器行为不一样VC和GCC不一样。而非POD的初始化则都会被初始化。 从这点可以看出C/C的初始化问题很奇怪所以在C 2011版中就做了统一。原文作者给出了如下的示例 1 2 3 4 5 6 7 8 9 C c {0,0}; //C11 only. 相当于: C c(0,0); int* a new int[3] { 1, 2, 0 }; /C11 only class X { int a[4]; public: X() : a{1,2,3,4} {} //C11, member array initializer }; 容器的初始化 1 2 3 4 5 // C11 container initializer vectorstring vs{ first, second, third}; map singers { {Lady Gaga, 1 (212) 555-7890}, {Beyonce Knowles, 1 (212) 555-0987}}; 还支持像Java一样的成员初始化 1 2 3 4 5 6 class C { int a7; //C11 only public: C(); }; 转载于:https://www.cnblogs.com/lightz/p/3417006.html