首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    现代 C++:自动类型推导

    自动类型推导,通俗地讲就是定义一个变量的时候不需要明确指定类型,而是让编译器根据上下文进行推导。 在 C++11 之前,模板(template)代码就支持编译器自动类型推导。...auto 我们来看看 auto 关键字在 C++ 中的使用。 最简单的用法,定义变量的时候不指定类型,通过初始化的值让编译器自动推导。...World"; // d 是 const char* 类型 auto e = std::string("Hello"); // e 是 std::string 类型 auto 和容器类型、迭代器一起配合使用...如果 b 和 e 是自定义的迭代器,不一定能用 typename std::iterator_traits::value_type 来获得类型。...+14", "C++17", "C++20"}; // v[0] 的返回值类型是 std::string&,但是 a 是 std::string auto a = v[0]; // a 是 std:

    1.7K30

    c++17好用的新特性总结

    C++14在11的基础上查缺补漏,并未加入许多新特性,而C++17作为C++11后的第一个大版本,标志着现代C++逐渐走向成熟。......... 1.auto关键字 从c++11开始,auto关键字能够通过初始化器推导出变量的类型。在c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。...from_chars( str.data(), str.data()+str.size(),result ); std::cout << result << std::endl; // p是填充到str以后的最后一个迭代器...在c++17之前,只能自己通过独占锁和条件变量自己实现读写锁或使用c++14加入的性能较差的std::shared_timed_mutex。...bool 表达式不能用 ++, – 这两个自增(减)运算符了 c++17中异常已经成为了类型系统的一部分, 枚举的直接列表初始化 结构化绑定 constexpr if 表达式

    3.4K10

    C++17, 语言核心层有哪些新的变化?

    看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第一篇~ C++11, C++14, 以及 C++17....那么 C++17 是大标准还是小标准呢?从我的观点来看,答案其实挺简单的: C++17 介于 C++14 和 C++11 之间,既不属于大标准也不属于小标准,至于原因,看看下面的说明吧....除了功能特性,C++17中还有一些旨在提升代码运行效率的特性. guaranteed copy elision RVO是返回值优化(Return Value Optimisation)的简称,他的作用是允许编译器移除一些不必要的复制操作...,但RVO一直都只是一种可能优化步骤(并没有标准规范,编译器可以选择进行RVO或者不进行RVO),C++17中通过定义 guaranteed copy elision 保证了这种优化的执行....+17 上述代码(第4行)与之前代码的一个细微差别是:在C++17中,编译器仍然可以执行一次 myVal 的复制操作(也可以不执行复制),但第7行代码仍然保证不会发生复制操作.

    86020

    C++17中新特性

    1. auto关键字 从c++11开始,auto关键字能够通过初始化器推导出变量的类型。在c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。...auto推导的规则变得更加直观。 2. lambda表达式 lambda也是c++11中引入的,在C++11中,lambda表达式只能用捕获this,this是当前对象的一个只读的引用。...C++17之前,我们定义全局变量, 总需要将变量定义在cpp文件中,然后在通过extern关键字来告诉编译器 这个变量已经在其他地方定义过了。...bool 表达式不能用 ++, -- 这两个自增(减)运算符了 c++17中异常已经成为了类型系统的一部分, 枚举的直接列表初始化 结构化绑定 constexpr if 表达式 map支持merge和extract...C++17的新特性已经编译器的支持情况请参考 compiler_support#cpp17

    4.9K30

    GCC编译器的-std选项

    GCC支持在编译的时候使用-std选项来选择编译语言的标准。程序本身也是在发展的,不断变化的。...以 C 语言为例,发展至今该编程语言已经迭代了诸多个版本,例如 C89(偶尔又称为 C90)、C94(C89 的修订版)、C99、C11。...同样,C++语言也经历了很多的标准变化,例如C++11,C++14,以及现在最新的C++20。既然语言都发展了这么多的标准,GCC编译器当然也要提供一个标准开关,他就是-std选项。...对于编译 C、C++ 程序来说,借助 -std 选项即可手动控制 GCC 编译程序时所使用的编译标准。 这个选项的使用的方式也很简单。下面就是一个例子。...g++ -Wall -std=c++17 test.c 有关这些标准可以参考如下。 ?

    2.7K20

    C++雾中风景12:聊聊C++中的Mutex,以及拯救生产力的Boost

    C++的标准库支持如下的互斥量的实现: 互斥量 版本 作用 mutex C++11 最基本的互斥量 timed_mutex C++11 有超时机制的互斥量 recursive_mutex C++11 可重入的互斥量...recursive_timed_mutex C++11 结合 2,3 特点的互斥量 shared_timed_mutex C++14 具有超时机制的可共享互斥量 shared_mutex C++17...(所以对工具不足时可以考虑求助于boost库,确实是解放生产力的大杀器,C++的标准库实在太简陋了~~) 2.标准库互斥量的剖析 虽然吐槽了一小节,但并不影响继续去学习C++标准库给我们提供的工具......shared_lock C++14 共享互斥量的管理 scope_lock C++17 多互斥量避免死锁的管理 创建互斥量管理对象时,它试图给给定mutex加锁。...pthread_rwlock_t的结构 这里有个事情挺奇怪的,C++14提供了shared_timed_mutex 而在C++17提供了shared_mutex。

    97021

    从零开始一起学习SLAM | C++新特性要不要学?

    不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套。 本文所谓的C++新特性是指C++11及其以后的C++14、C++17增加的新关键字和新语法特性。...其中C++11是C++98以来最重要的一次变化,而其后的C++14、C++17是在该基础上的完善和补充。 那么,问题来了,如果我不想学习新特性,还是像以前那样编程可以吗?...C++11之前如果我们要定义并初始化一个新变量,必须得知道其类型并定义,这在很多时候是非常繁琐的,比如迭代器的使用,而C++11之后引入了自动类型推导,一个auto解决一切,不需要关心类型,编译器会帮你自动推导出类型...比如迭代器使用了自动类型推导后,感觉清爽多了,如下图所示: ?...而且这种循环支持大部分数据类型,比如数组,容器,字符串,迭代器等等。 ?

    78020

    C++雾中风景12:聊聊C++中的Mutex,以及拯救生产力的Boost

    C++的标准库支持如下的互斥量的实现: 互斥量 版本 作用 mutex C++11 最基本的互斥量 timed_mutex C++11 有超时机制的互斥量 recursive_mutex C++11 可重入的互斥量...recursive_timed_mutex C++11 结合 2,3 特点的互斥量 shared_timed_mutex C++14 具有超时机制的可共享互斥量 shared_mutex C++17...(所以对工具不足时可以考虑求助于boost库,确实是解放生产力的大杀器,C++的标准库实在太简陋了~~) 2.标准库互斥量的剖析 虽然吐槽了一小节,但并不影响继续去学习C++标准库给我们提供的工具......shared_lock C++14 共享互斥量的管理 scope_lock C++17 多互斥量避免死锁的管理 创建互斥量管理对象时,它试图给给定mutex加锁。...shared_mutex C++14的版本之后提供了共享互斥量,它的区别就在于提供更加细粒度的加锁操作:lock_shared。

    1.2K41

    C++17常用新特性(二)---内联变量

    从C++17开始,在编写C++代码时就可以在头文件中定义inline变量。且在编译时也不会报错,如果同时有多份代码文件引用了该头文件,编译器也不会报错。不管怎么说,这是一种进步。...如果在一个类中定义了一个静态成员变量,然后在类的外部进行初始化,本身符合一次定义原则。但是如果在多个CPP文件同时包含了该头文件,在链接时编译器会报错。...因为我们定义一个变量的时候默认就已经被立即初始化了。 2 内联变量的使用 C++17中内联变量的使用可以帮助我们解决实际编程中的问题而又不失优雅。...struct MY_DATA { inline static constexpr int n = 5; } 4 内联变量和thread_local 在支持C++17的编译器编程时使用thread_local...thread_local std::string strName; }; inline thread_local std::vector vCache; 如上,通过thread_local修饰的内联变量就给每一个线程对象创建的属于自己的内联变量

    2.4K30

    C++中auto关键字用法

    auto 是 C++11 引入的关键字,用于让编译器自动推导变量的类型。它可以用于声明变量、函数返回类型、以及范围迭代器等地方。 以下是 auto 关键字的主要用法: 1....范围迭代器: #include #include int main() { std::vector numbers = {1, 2, 3, 4...函数返回类型推导(C++14+): C++14 引入了函数返回类型的自动推导,允许在函数定义中使用 auto 作为返回类型的占位符。...结构化绑定(C++17+): C++17 引入了结构化绑定(structured bindings),可以与 auto 一起使用,方便地访问容器、元组等的成员。...在需要明确指定类型的情况下,尤其是在函数接口和公共代码中,最好使用显式的类型声明。 使用 auto 的主要优势在于简化代码,尤其是在处理复杂类型、迭代器、以及模板中。

    61710

    现代C++之如何返回一个对象?

    一个用来返回的对象,通常应当是可移动构造 / 赋值的,一般也同时是可拷贝构造 / 赋值的。如果这样一个对象同时又可以默认构造,我们就称其为一个半正则(semiregular)的对象。...如果可能的话,我们应当尽量让我们的类满足半正则这个要求。 1.返回值优化(拷贝消除) 下面编译的gcc版本是支持c++17的gcc8.3。如果使用gcc5.5等版本结果会不同。...在 C++14 及之前确实是这样的。但从 C++17 开始,对于类似于 getA_unnamed这样的情况,即使对象不可拷贝、不可移动,这个对象仍然是可以被返回的!...C++17 要求对于这种情况,对象必须被直接构造在目标位置上,不经过任何拷贝或移动的步骤。...从 C++11 开始,返回值优化仍可以发生,但在没有返回值优化的情况下,编译器将试图把本地对象移动出去,而不是拷贝出去。

    1.3K20

    深入解析C++的auto自动类型推导

    这篇文章我们来解析auto自动类型推导的推导规则,以及使用auto有哪些优点,还有罗列出自C++11重新定义了auto的含义以后,在之后发布的C++14、C++17、C++20标准对auto的更新、增强的功能...,比如我们将一种容器的类型改为另一种容器,迭代器的类型不需要修改,如: std::map m = { ... }; auto it = m.begin(); // 修改为无序容器时...>类型,因此编译器会拷贝m中的所有元素到临时对象,然后再让p引用到这些临时对象,每迭代一次,临时对象就被析构一次,这就导致了无故拷贝了那么多次对象和析构临时对象,效率上当然会大打折扣。...如果你用auto来替代上面的定义,则完全可以避免这样的问题发生,如: for (const auto& p : m) {} 新标准新增功能 自动推导函数的返回值类型(C++14) C++14标准支持了使用...使用auto声明lambda的形参(C++14) C++14标准还支持了可以使用auto来声明lambda表达式的形参,但普通函数的形参使用auto来声明需要C++20标准才支持,下面会提到。

    37920

    第七章 函数

    +17标准强制忽略,C++17标准之前由编译器决定 } -fno-elide-constructors忽略C++11(C++17标准之前)中对复制临时对象强制忽略的约束 函数传值、传址、传引用 #include...) 也可包含局部静态对象 函数体执行完成时的返回 隐式返回 #include void fun() { std::cout << "Hello" << std::endl...,可以为void 返回类型的几种书写方法 经典方法:位于函数头的前部 C++11引入的方式:位于函数头的后部(泛型编程和类的成员函数编写可能会简化编写) C++14引入的方式...函数重载与name mangling 编译器如何选择正确的版本完成函数调用?...(image-37f2f5-1690910469933)] 函数相关的其他内容 递归函数:在函数体中调用其自身的函数 通常用于描述复杂的迭代过程(示例)比如二分查找 内联函数/constexpr函数

    19530
    领券