
28 |理解引用折叠
前面我们说过,形参为万能引用型别时,将根据实参的型别来决定最终param的型别:template<class T>void func(T&& param) {//do something}Widget w;func(w);//w为左值,T为Wi
2,3,4,5,6,7,8,9,10,11,12,13,14
前面我们说过,形参为万能引用型别时,将根据实参的型别来决定最终param的型别:template<class T>void func(T&& param) {//do something}Widget w;func(w);//w为左值,T为Wi
上一篇避免依万能引用型别进行重载讲过使用万能引用型别进行重载可能会存在的问题, 这一篇我们就来讲讲如何规避这些问题:一、舍弃重载既然万能引用重载会有问题,那么我们就直接多写几个函数,命名成不同名字,杜绝重载就可以。二、传递const T&型别的形参使用传递左值常量引用型别来替代万能引用型别,这样在就可以限制该函数接受的参数了。三、
如果我们在代码中使用万能引用型别作为函数重载的一个特征标,这样在我们使用该重载函数时,实际调用的函数可能与我们期望不符:示例代码如下:#include <memory>#include <iostream>#include <set>using namespace std;//万能引用型别重载templ
我们应该知道,一个函数接受一个右值引用参数后将变成左值(可以对其取地址),所以如果在函数内部想要继续使用其右值属性,就可以对其实施std::move,将形参左值转换回右值。对于万能引用,因为其实参可能是右值,也可能是左值(最终形参都是左值),所以对其实施std::forward,实参右值将被转换回右值,实参左值将什么都不做。至于为什么不
在前面的文章讲了很多万能引用,形式如"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的尺寸是裸指针的两倍,因为其内部除了包含了一个指涉到该资源的裸指针,还包含一个指涉到该资源的一个控制块的裸指针,该控制块为动态分配在堆上,内容包含