12 2018 档案
摘要:在标准C++中,枚举类型不是类型安全的。枚举类型被视为整数,这使得两种不同的枚举类型之间可以进行比较。C++03 唯一提供的安全机制是一个整数或一个枚举型值不能隐式转换到另一个枚举别型。 此外,枚举所使用整数类型及其大小都由实现方法定义,皆无法明确指定。 最后,枚举的名称全数暴露于一般范围中,因此C
阅读全文
摘要:从C++11开始,我们可以使用以下形式通过常量字符串构造自定义类型, 比如: Output: 在std::literals::chrono_literals的实现用,也用了类似的手段: 实现如下: 例子: Output:
阅读全文
摘要:std::call_once的作用是很简单的, 就是保证函数或者一些代码段在并发或者多线程的情况下,始终只会被执行一次。比如一些init函数,多次调用可能导致各种奇怪问题。 给个例子: Output:
阅读全文
摘要:这里主要介绍std::unique_lock与std::lock_guard的区别用法 先说简单的 一、std::lock_guard的用法 std::lock_guard其实就是简单的RAII封装,在构造函数中进行加锁,析构函数中进行解锁,这样可以保证函数退出时,锁一定被释放。 简单来说,就是防止
阅读全文
摘要:C++11中,针对顺序容器(如vector、deque、list),新标准引入了三个新成员:emplace_front、emplace和emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应push_front、insert和push_back,允许我们将元素放置在容器头部、一个指定
阅读全文
摘要:C++本身有引用(&),为什么C++11又引入了std::ref(或者std::cref)? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。如下例子: Output: 上述代码在执行std::bind后,在函数f()中n1的值仍然是1,n2和n3改成了修改的值。
阅读全文
摘要:先说明一点:std::asyanc是std::future的高级封装, 一般我们不会直接使用std::futrue,而是使用对std::future的高级封装std::async。 下面分别说一下。 一、std::async基本用法 std::future可以从异步任务中获取结果,一般与std::a
阅读全文