我有一个函数foo
。在执行foo
的过程中,我想确定Bar
类型的对象是否存在。让我们将任何碰巧是"bar
"的对象称为
我不能复制或移动bar
,bar
可以有任何存储持续时间。关于bar
,我知道的一件事是它是一个空对象。
foo
不需要对bar
做任何事情或了解它
-
首先要考虑的是,将一个
Bar&
传递到foo
中,告诉调用环境,"嘿,当我运行时,你需要确保bar
存在!">但是调用环境可以将一个悬空引用传递到foo
中,在这种情况下,bar
将在foo
运行之前被销毁。 -
第二个想法是,在中传递一个
shared_ptr
到bar
。但是(如果我错了,请纠正我(这需要bar
具有动态存储持续时间。 -
第三个想法是,编写一个可复制和可移动的辅助类型,以保证
bar
的存在。但这感觉就像是在重新发明shared_ptr
车轮。
我有哪些选项可以确保bar
在foo
期间存在,它们的优势和局限性是什么?
调用环境可以将悬空引用传递到foo
真的不行。挂起引用是不合法的,所以发生这种情况的唯一方法是调用方违反语言规则。我觉得这不是一个令人信服的问题。
将shared_ptr传递给bar。但这需要bar具有动态存储持续时间。
不完全是。shared_ptr可以用自定义的deleter来构造,因此如果调用者想要传入一个";堆栈分配";Bar
,它们可以构造一个带有不删除任何内容的deleter的shared_ptr。
bar是一个空对象
那么整个练习的意义是什么?是因为Bar
构造函数和/或析构函数有副作用,必须在foo
运行之前/之后发生吗?如果是这样的话,也许foo
应该自己做这些事情,或者可以创建foo_wrapper
函数来隐藏这些细节。