c – 当返回一个对象时,为什么要将创建初始化和返回作为两个单独的语句而不是一个?

例:

Foo make_foo(int a1, int a2){
  Foo f(a1,a2);
  return f;
}

多次看过这样的功能,只是编码风格/偏好的问题,还是有更多的东西而不是眼睛?特别是this answer让我思考make_unique实现和它是异常安全的声明 – 是否与创建和返回的分裂有关?还是我读了太多这个?为什么不简单写

Foo make_foo(int a1, int a2){
  return Foo(a1,a2);
}
最佳答案
请注意,您实际引用的答案实际上有所不同:

std::unique_ptr<T> ret (new T(std::forward<Args>(args)...));

在这行代码中,执行显式动态分配.最佳实践规定,无论何时执行显式动态分配,都应立即将结果分配给指定的智能指针.有关详细信息,请参阅the Boost shared_ptr best practices documentation或Herb Sutter的GotW文章,“Exception-Safe Function Calls.”

将新表达式作为较大表达式的子表达式并不总是危险的,但这是一个容易忘记的规则,因此最好始终遵循最佳实践指南并将新的动态分配对象分配给命名的智能指针.

也就是说,创建命名对象然后返回它的模式至少有一个优点:当快速单步执行代码时,可以更容易“监视”调试器中的对象.

一个可能的缺点是编译器可能更难以使用命名对象执行返回值优化(RVO).命名返回值优化(NRVO)并不总是像具有未命名临时值的RVO一样简单.我不敢猜测现代编译器不会有任何问题,但我不是C编译器优化方面的专家.

转载注明原文:c – 当返回一个对象时,为什么要将创建初始化和返回作为两个单独的语句而不是一个? - 代码日志