C++11、C++14、C++17、C++20常用新特性
C11自动类型推断auto关键字C11引入了auto关键字可以根据变量初始值自动推导出变量类型。例如12auto i 42;// i被推导为int类型auto d 3.14;// d被推导为double类型基于范围的for循环range-based for loop可以方便地遍历容器中的元素例如1234std::vectorint v {1, 2, 3, 4, 5};for(auto i : v) {i * 2;}lambda表达式lambda表达式可以用来定义匿名函数方便地传递函数对象例如12auto f [](intx,inty) -int{returnx y; };intresult f(3, 4);// result 7移动语义和右值引用move semantics和rvalue references通过右值引用可以实现资源的有效移动而不是复制提高程序的效率例如12std::vectorint v1 {1, 2, 3, 4, 5};std::vectorint v2 std::move(v1);// v2接管了v1的资源v1变为无效状态智能指针smart pointersC11引入了三种智能指针unique_ptr、shared_ptr和weak_ptr可以更好地管理动态内存避免内存泄漏和悬空指针例如123std::unique_ptrint p(newint(42));std::shared_ptrint q std::make_sharedint(42);std::weak_ptrint r q;空指针常量nullptrC11引入了nullptr关键字用于表示空指针避免了NULL宏带来的一些问题例如12voidf(int* p) {}f(nullptr);// 可以显式地传递空指针右值引用与移动构造函数右值引用可以方便地实现移动构造函数和移动赋值运算符用于高效地处理临时对象和避免复制开销例如12345678910classMyVector {public:MyVector(MyVector other) noexcept {// 移动构造函数}MyVector operator(MyVector other) noexcept {// 移动赋值运算符return*this;}};初始化列表可以方便地初始化数组和容器例如12std::vectorint v {1, 2, 3, 4, 5};std::mapstd::string,int m {{one, 1}, {two, 2}, {three, 3}};类型别名type alias可以使用using关键字定义类型别名例如12usingIntVec std::vectorint;IntVec v {1, 2, 3, 4, 5};模板别名template alias可以使用using关键字定义模板别名例如123templatetypenameTusingVec std::vectorT;Vecint v {1, 2, 3, 4, 5};constexpr函数和变量可以在编译期计算出值例如1234constexprintfib(intn) {return(n 1) ? 1 : fib(n-1) fib(n-2);}constexprintx fib(10);// 编译期计算出x的值为89变长参数模板variadic templates可以接受任意数量和类型的参数例如123456templatetypename... Argsvoidprint(Args... args) {std::cout sizeof...(args) std::endl;// 打印参数个数}print(1, 2, 3);// 打印3print(hello, 3.14);// 打印2C14泛型lambda表达式可以使用auto关键字在lambda表达式中推断参数类型例如123auto sum [](auto x, auto y) {returnx y; };std::cout sum(1, 2) std::endl;// 输出3std::cout sum(1.5, 2.5) std::endl;// 输出4.0return type deduction for normal functions函数返回类型推断可以使用auto关键字让编译器自动推断函数的返回类型例如123auto add(intx,inty) {returnx y;// 返回类型会自动推断为int}模板变量template variable可以使用关键字template定义模板变量例如123templatetypenameTconstexpr T pi T(3.1415926535897932385);std::cout pidouble std::endl;// 输出3.14159...静态断言static_assert的增强可以在静态断言中加入一个字符串提示例如1static_assert(sizeof(int) 4,int必须是4字节);// 如果sizeof(int)不等于4会输出提示信息字符串字面量的增强可以使用单引号包围字符例如12constexprcharoperator_c(charc) {returnc; }// 将字符转化为字符std::cout a_c std::endl;// 输出字符a按值捕获的增强可以使用关键字init来对按值捕获的变量进行初始化例如123intx 1, y 2;auto f [x, y x 1] {returnx y; };std::cout f() std::endl;// 输出4变量模板variable template可以使用关键字template定义变量模板例如123templatetypenameTconstexpr T pi T(3.1415926535897932385);std::cout pidouble std::endl;// 输出3.14159...内存模型的增强增加了对内存模型的规定例如123456std::atomicint x 0;// 原子变量#pragma omp parallel forfor(inti 0; i 1000; i) {x.fetch_add(1);// 线程安全的对x进行加一操作}std::cout x std::endl;// 输出1000C17结构化绑定Structured Binding可以使用auto关键字对一个结构体或元组进行结构化绑定例如123std::pairint,int p {1, 2};auto [x, y] p;// 结构化绑定std::cout x y std::endl;// 输出1 2if语句和switch语句的初始化可以在if语句和switch语句的判断条件中进行变量初始化例如123if(intx get_value(); x 0) {// 在if语句中初始化变量xstd::cout x is positive std::endl;}类模板的参数推断Class Template Argument DeductionCTAD可以让编译器自动推断类模板的模板参数例如1std::pair p{1, 2};// 编译器可以自动推断出std::pairint, intconstexpr if可以在编译期进行条件判断根据判断结果选择不同的代码路径例如12345678templatetypenameTvoidfoo(T t) {ifconstexpr (std::is_pointer_vT) {// 如果T是指针类型std::cout t is a pointer std::endl;}else{// 如果T不是指针类型std::cout t is not a pointer std::endl;}}折叠表达式Fold Expression可以使用折叠表达式来简化代码例如12345templatetypename... Argsauto sum(Args... args) {return(args ...);// 对args进行折叠求和}std::cout sum(1, 2, 3, 4) std::endl;// 输出10内联变量Inline Variable可以使用inline关键字来定义内联变量例如1inlineintx 1;// 定义一个内联变量x初始值为1嵌套命名空间Nested Namespace可以在命名空间中嵌套命名空间例如12345678namespaceA {namespaceB {voidfoo() {std::cout hello, world! std::endl;}}}A::B::foo();// 调用函数fooC20概念Concepts概念是一种新的语言结构可以用来描述模板参数的要求例如1234567templatetypenameTconcept Integral std::is_integral_vT;templatetypenameTvoidfoo(T t) requires IntegralT {// 使用概念描述模板参数要求std::cout t std::endl;}foo(1);// 调用foo函数三方合并运算符Three-way Comparison Operator可以使用运算符对两个对象进行三方比较例如12345678910111213structPoint {intx, y;auto operator(constPoint other)const{returnstd::tie(x, y) std::tie(other.x, other.y);}};booloperator(constPoint lhs,constPoint rhs) {returnlhs.x rhs.x lhs.y rhs.y;}std::setPoint s{{1, 2}, {2, 1}, {1, 1}, {2, 2}};for(constauto p : s) {std::cout p.x , p.y std::endl;}输出结果为1, 11, 22, 12, 2初始化的捕获列表Init-Capture可以在lambda表达式的捕获列表中进行初始化例如12345intx 1;auto lambda [value x * 2]() {// 在捕获列表中初始化变量valuestd::cout value std::endl;};lambda();// 调用lambda表达式consteval函数可以在编译期计算表达式的值例如12constevalintget_value() {return42; }// 定义一个在编译期计算的函数std::arrayint, get_value() arr;// 在编译期创建一个大小为42的数组
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2632253.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!