返回对象时,为什么将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);
}
没有找到相关结果
已邀请:
5 个回复
鞋扣蚊冈借
在此代码行中,执行显式动态分配。最佳实践表明,每当执行显式动态分配时,都应立即将结果分配给命名的智能指针。有关更多详细信息,请查阅Boost
最佳实践文档或Herb Sutter的GotW文章“异常安全的函数调用”。 将ѭ5表达式作为较大表达式的子表达式并不总是很危险,但是这是一个容易忘记的规则,因此最好始终遵循最佳实践准则并动态分配新的将对象分配给命名的智能指针。 就是说,创建命名对象然后返回它的模式至少有一个优点:在调试程序中快速“遍历”代码时,“监视”对象可能会容易一些。 一个可能的缺点是,对于编译器而言,使用命名对象执行返回值优化(RVO)可能会更加困难。命名返回值优化(NRVO)并不总是像RVO一样简单,带有未命名的临时变量。我很容易猜测现代编译器无论哪种方式都不会出现问题,但是我不是C ++编译器优化方面的专家。
粳饶瓢部
艰管垮淮
撵穆
稍惮
在某些编译器(如较旧的MSVC)中更有可能触发NRVO优化。 版本2对于实现RVO的编译器应该同样有效,但是从历史上看,它并不可靠。