
24| 区分万能引用和右值引用
在前面的文章讲了很多万能引用,形式如"T&&",但右值引用也可以这样表示,具体什么样的才是万能引用呢?万能引用必须涉及型别推导,且参数形式必须为“T&&”,不能带有任何其他修饰关键字(const、volatile),不是万能引用就是右值引用:template <class T>
2,3,4,5,6,7,8,9,10,11,12,13,14
在前面的文章讲了很多万能引用,形式如"T&&",但右值引用也可以这样表示,具体什么样的才是万能引用呢?万能引用必须涉及型别推导,且参数形式必须为“T&&”,不能带有任何其他修饰关键字(const、volatile),不是万能引用就是右值引用:template <class T>
std::move()实施的是无条件的向右值型别进行强制类型转换,而std::forward仅当实参是右值时,才会将参数转换为右值,且它们都仅仅时强制类型转换,并不做移动操作。 std::move()的使用场景没有什么好说的了,当你需要实参是右值时,执行该函数就对了,因为它可以百分百返回参数对应的右值。关于std::forward的使用
Pimpl习惯用法指的是pointer to implementation,即指涉到实现的指针。这种技巧就是把某类的数据成员用一个指涉到某实现类的指针替代,然后把原来在主类中的数据成员放置到实现类中,并通过指针间接访问这些数据成员。示例代码://Widget.h中class Widget {public:Widget();private:
首先要知道, std::make_shared是C++11引入的一个make函数,而std::make_unique是C++14才引入。使用 std::make_shared及std::make_unique代替new的好处:(1)代码量更小,不需要承父撰写型别auto upw1(std::make_unique<Widget>
std::weak_ptr一般使用std::shared_ptr来创建,但std::weak_ptr并不会增加std::shared_ptr的计数:auto spw = std::make_shared<Widget>();//spw的引用计数并不会增大std::weak_ptr wpw(spw);若上述代码中的spw被析构,
std::shared_ptr通过引用计数的方式实现资源共享,当计数为0时,资源将被释放,和std::unique_ptr不同的是其不能处理数组,只能处理单个对象。std::shared_ptr的尺寸是裸指针的两倍,因为其内部除了包含了一个指涉到该资源的裸指针,还包含一个指涉到该资源的一个控制块的裸指针,该控制块为动态分配在堆上,内容包含
当需要使用智能指针时,std::unique_ptr基本上应当是首选,因为默认情况下std::unique_ptr和裸指针有着相同的尺寸,且对于大多数的操作(包括提领),他们都是精确的执行了相同的指令。std::unique_ptr实现的是专属所有权语义,其只支持移动,不支持复制,也不能将一个裸指针直接赋值给std::unique_ptr
这里所说的特种成员函数包括C++98已有的默认拷贝函数、析构函数、复制构造函数、复制赋值运算符以及C++11新增的移动构造函数以及移动赋值运算符。这些特种成员函数在特定场合,编译器都可以自动为其生成,且访问权限都是public的,inline类型的。以下几点是特种成员函数生成的特点:仅当一个类没有声明任何构造函数时,编译器才会自动生成默
我们知道const成员函数不会修改成员变量,即对变量进行只读操作,但是即使是只读,其函数真的是安全的吗?例如,我们在一个成员函数内获取某个对象的一个变量的值,其值在第一次和第二次读取有差异,代码如下:class MyClass{public:void Init() const {if (!Init
constexpr变量必须使用一个具有const属性,且在编译阶段就已知的值对其初始化。例如:int x = 0;const int y = x; //可以使用x对cosnt变量初始化const int z =&n