【发布时间】:2020-06-27 06:12:10
【问题描述】:
这段代码安全吗?如果方法接受值或右值引用,答案会改变吗? unique_ptr 有变化吗?
struct foo
{
void bar(std::shared_ptr<foo> p) // or std::shared_ptr<foo>&&
{
// the object will be deleted at the end of the call unless p is
// moved/copied elsewhere at some point
}
};
int main()
{
auto p = std::make_shared<foo>();
p->bar(std::move(p));
return 0;
}
主要问题具体在这一行:
p->bar(std::move(p));
这是否保证在构造参数之前始终捕获p.operator->() 的当前值?还是在从p 移出后会发生这种情况?
(注意:我相信这对于std::shared_ptr<foo>&& 参数是安全的,因为如果有的话,实际的移动构造直到在方法体内部才会发生。但是当按值传递时,参数构造可以[包括移动构造] 在调用 p.operator->() 之前发生,还是总是严格在之后?)
【问题讨论】:
-
这是一个关于特定的、旧的、C++ std 还是关于所有从不早于 C++11 开始的 C++ std 版本的 Q?
-
我引用 C++11 作为最低要求,因为那是
unique_ptr和shared_ptr被引入的时候。我实际上混合了 C++11 和 C++17 应用程序,而 walnut 的回答解决了这两个问题。
标签: c++ c++11 language-lawyer shared-ptr move-semantics