gpt4 book ai didi

c++ - 在参数中移出的智能指针上调用方法是否安全?

转载 作者:行者123 更新时间:2023-12-02 03:34:21 28 4
gpt4 key购买 nike

这段代码安全吗?如果方法接受值或右值引用,答案会改变吗?是否会更改为 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>&& 参数是安全的,因为实际的 move 构造直到在方法体内才会发生(如果有的话)。但是当按值传递时,参数构造可以[其中包括 move 构造]发生在调用 p.operator->() 之前,还是总是严格在调用之后?)

最佳答案

如果您使用std::shared_ptr<foo>&&作为参数类型(或任何引用类型),那么就没有问题,因为std::move call 实际上不会以任何方式修改对象。是否先执行并不重要。

在 C++17 之前,按值变体并不安全。没有排序规则可以保证在函数参数初始化之前对命名函数的表达式进行求值。因此函数参数的 move 构造可能发生在p->bar之前。已评估。

自 C++17 起,命名函数的后缀表达式的值计算和所有副作用都在调用参数中的所有表达式的值计算和副作用之前排序,这意味着函数的构造函数参数在评估p->bar之后排序。请参阅[expr.call]/5 。因此潜在的问题operator->调用p首先发生在 move 构造之前,使代码安全。

如果替换 std::shared_ptr,同样的语句成立。与 std::unique_ptr .

关于c++ - 在参数中移出的智能指针上调用方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60700769/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com