为什么我们需要传递常量共享指针作为引用?
Why do we need to pass const shared pointer as reference?
当我阅读开源代码时,我发现了以下内容,其中共享指针以两种不同的方式传递给函数。
class A{A();};
typedef std::shared_ptr<A> A_Ptr;
void func1(A_Ptr a);
void func2( const A_Ptr& a);
使用常量时将其作为引用传递的原因是什么?我知道 func2 的作者不希望该函数能够更改 a 中的任何内容。但是我们不能const A_Ptr a
这样做吗?另外,我们不应该在 func1 中使用A_Ptr & a
传递它的原因是什么?
代码中出现上述情况:
Git:https://github.com/uzh-rpg/rpg_svo/
代码中的 FramePtr 列表
void FrameHandlerMono::setFirstFrame(const FramePtr& first_frame(
void DepthFilter::addFrame(FramePtr frame(
我们不能只在框架
const FramePtr
这样做吗?
当然,我们可以,但是随后将调用复制构造函数,这对于较大的类型(任何大于内置类型的东西(通常比通过引用传递更昂贵。这不是shared_ptr
所特有的。如果您不需要副本并且不想更改它们,则通常默认通过 const 引用传递任何对象。只有 int、float 或 char 等内置类型才应按值传递。
更有趣的是为什么func1
使用副本。最有可能的情况是,无论如何他都需要一份副本,因为他想在课堂上保留一个参考文献。我在您发布的 github 存储库中找不到您引用的确切文件。如果仍然不清楚,请将 func1 的功能主体转到问题中。
编辑:啊,我明白了。看起来他在这里按值传递的原因更多地与线程安全有关。没有阅读整个内容,否则如果他通过 const 引用传递,shared_ptr
可能会被拥有线程删除。
这里对于 examle func 需要按值传递,否则指针可能会被主线程删除。可能是这样的,但更复杂:
#include <chrono>
#include <iostream>
#include <memory>
#include <thread>
using namespace std::chrono_literals;
struct S {
S() {}
};
void
//This signature would be false
//func(std::shared_ptr<S> const& s)
func(std::shared_ptr<S> s)
{
std::cout << s.use_count() << 'n';
std::this_thread::sleep_for(2s);
//use_count would be 0 here if we pass by reference
std::cout << s.use_count() << 'n';
}
int
main(int argc, char**) {
std::shared_ptr<S> s{std::make_shared<S>()};
std::thread t{func, std::ref(s)};
std::this_thread::sleep_for(1s);
s.reset();
t.join();
return 0;
}
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用