返回对象时,为什么将creation + initialization和return放在两个单独的语句中而不是一个?

| 例:
Foo make_foo(int a1, int a2){
  Foo f(a1,a2);
  return f;
}
已经看过几次这样的功能,仅仅是编码风格/偏好的问题,还是它所吸引的不只是眼球?具体来说,这个答案让我想到了“ 1”实现,并且声称它是例外安全的-与创建和返回的拆分有关吗?还是我对此读得太多?为什么不简单地写
Foo make_foo(int a1, int a2){
  return Foo(a1,a2);
}
    
已邀请:
        请注意,您所引用的答案实际上有所不同:
std::unique_ptr<T> ret (new T(std::forward<Args>(args)...));
在此代码行中,执行显式动态分配。最佳实践表明,每当执行显式动态分配时,都应立即将结果分配给命名的智能指针。有关更多详细信息,请查阅Boost
shared_ptr
最佳实践文档或Herb Sutter的GotW文章“异常安全的函数调用”。 将ѭ5表达式作为较大表达式的子表达式并不总是很危险,但是这是一个容易忘记的规则,因此最好始终遵循最佳实践准则并动态分配新的将对象分配给命名的智能指针。 就是说,创建命名对象然后返回它的模式至少有一个优点:在调试程序中快速“遍历”代码时,“监视”对象可能会容易一些。 一个可能的缺点是,对于编译器而言,使用命名对象执行返回值优化(RVO)可能会更加困难。命名返回值优化(NRVO)并不总是像RVO一样简单,带有未命名的临时变量。我很容易猜测现代编译器无论哪种方式都不会出现问题,但是我不是C ++编译器优化方面的专家。     
        将创建和返回结合起来是完全可以的,教科书通常在单独的行上执行此操作以在某种程度上阐明代码。     
        它完全取决于您的要求,您可以将它们放在单个语句中,以使代码更具可读性。 在大多数书籍和其他技术资源中,在前面的章节中都有关于创建,实例化和返回的单独语句,但是在您继续阅读时,它们会合并为一个语句。     
        就个人而言,每当我编写类模板时,我也会编写相应的“ 6”函数模板,以允许创建类模板类型的对象,而无需显式指定模板参数。当然,这通常仅在使用具有C ++ 0x的ѭ7compiler语义的编译器或将临时函数作为函数参数传递时使用,但在我看来,这两种情况都是足够常见的情况,值得我们付出努力。 就是说,我从未编写过这样的代码来创建非模板类型。     
        历史上,第一个版本
Foo make_foo(int a1, int a2)
{
    Foo f(a1,a2);
    return f; 
} 
在某些编译器(如较旧的MSVC)中更有可能触发NRVO优化。 版本2对于实现RVO的编译器应该同样有效,但是从历史上看,它并不可靠。     

要回复问题请先登录注册