本帖最后由 lhgzbxhz 于 2022-4-18 10:13 编辑
1. 我猜你问的是函数返回一个shared_ptr<xxx>的意义?函数尽量返回一个智能指针而非裸指针的意义可参见《Effective C++》条款13,而shared_ptr的意义还在《Effective Modern C++》条款19中有所补充。
简单来说,shared_ptr代表共享资源所有权,当你想要共享资源的所有权时就用(但为了避免开销过大,还是尽量返回unique_ptr,况且客户可以方便地把unique_ptr转换为shared_ptr。)
2. 这是一个天坑……你暂时可以这么理解:
- void f1(std::string& s);
- void f2(const std::string& s);
- void f3(std::string s)
- int main()
- {
- f1("abc"); // 不行
- f2("abc"); // 可以
- f3("abc"); // 可以,但是有一次复制开销
- }
复制代码
像上述代码中f3那样传值,一般会有复制对象的开销(假设编译器不优化),所以一般会像f2, f1那样引用传参。
为什么上述代码中对f1的调用无法通过编译,而对f2的调用可以呢?因为参数"abc"实际上是通过const char*构造的一个std::string临时对象,而f1的参数类型为std::string&,这暗示了
可以在f1函数内修改这一参数。(不管实际上有没有修改)而修改一个临时变量是不允许的,所以编译器拒绝了这种调用。
解决的方法就是像f2那样用const std::string&,主动告诉编译器:“我们不打算修改s参数”,编译便可以通过了。
但是:以上说的仅仅是C++98时代的内容,C++11加入了
右值引用,并由此实现了
移动语义与
完美转发,上述写法一般被认为“过时了”。如果你想深入了解的话,《More Effective C++》有整整一章(条款23~30)是讲这个的,建议去看看。