gpt4 book ai didi

c++ - 使用 unique_ptr 作为参数在类上调用方法是否合法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:02 25 4
gpt4 key购买 nike

例如,如果您有一个声明 std::unique_ptr<A> a; ,那么下面会不会出问题呢?

a->foo(std::move(a));

就我而言,foo是一个虚函数,所以我不能把它移出类。如果上面的代码导致问题,那么有什么替代方法可以达到同样的效果?

最佳答案

C++11 和 C++14

这取决于foo的签名:

  • 如果是 foo(std::unique_ptr<A> &&) , 那么调用是安全的,因为指针保留旧值直到 foo开始执行。是否foo更改指针是不相关的,因为被调用函数执行中的任何语句都在命名函数的表达式求值之后排序。
  • 如果是 foo(std::unique_ptr<A>) ,则该调用具有未定义的行为。尽管有一条规则,运算符的操作数在计算运算符结果之前先求值(因此您必须先求值 a,然后才能知道要调用谁的 foo,从而调用它),但这还不够在这里,因为没有规则说函数参数在函数名称表达式之后排序。因此,a可能已经被转移,并且调用了a.operator ->()包含取消引用空指针的尝试。

C++17

从 C++17 开始,它是安全的。添加了几个新的排序规则,其中一个恰好解决了这种情况:

In a function-call expression, the expression that names the function is sequenced before every argument expression and every default argument.

Source

啊,好吧,我应该为 pre-17 C++ 发布一个安全版本。很简单,自己添加必要的排序即可,例如通过使用两个语句:

auto aRaw = a.get();
aRaw->foo(std::move(a));

关于c++ - 使用 unique_ptr 作为参数在类上调用方法是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47374836/

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