【发布时间】:2017-07-18 12:01:39
【问题描述】:
假设我们有以下函数:
void doStuff(const std::vector<std::shared_ptr<const Foo>>& fs) { }
有没有办法(安全地)将std::vector<std::shared_ptr<Foo>> 传递给这个参数?例如:
std::vector<std::shared_ptr<Foo>> foos;
doStuff(foos);
这种隐式转换失败了,但可以通过强制转换安全地完成吗? (这在理论上似乎是安全的,因为doStuff 函数将无法修改向量,也无法修改其中的对象。)
【问题讨论】:
-
我发现将 shared_ptr 设为 const 项会增加不必要的复杂性。但我认为没有 hack 就无法做到这一点。
-
这绝对是未定义的行为。内存布局可能看起来它应该每次都可以工作,但你不能依赖它。谁知道编译器可能会进行什么转换,包括删除任何呈现未定义行为的代码。
-
什么是未定义行为?我的问题中的代码无法编译,所以也许您指的是一些假设的
const_cast? -
@jtbandes 道歉,我指的是假设的
reinterpret_cast或 c 演员。我看不出const_cast是如何解决这个问题的。如果它只是一个const_cast它可以很好地定义。const_cast无法从std::vector<const T>&转换为std::vector<T>&。 -
@AnonMail 我知道它是如何增加复杂性的,但是在这里省略
const也会允许被调用者修改底层对象。有没有办法避免这种情况?我想如果shared_ptr只有T* operator->();和const T* operator->() const;那么它可以与const vector<shared_ptr<T>>一起工作,但事实并非如此......
标签: c++ type-conversion constants shared-ptr