此代码安全吗?如果方法接受值或右值引用,答案是否会改变? 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->()
之前发生的,还是总是严格地在此之后发生?]
如果使用std::shared_ptr<foo>&&
作为参数类型(或任何引用类型),则没有问题,因为std::move
调用实际上并没有以任何方式修改对象。是否先执行都无所谓。
在C ++ 17之前,按值变体不安全。没有排序规则可以保证在初始化函数参数之前对命名函数的表达式进行求值。