【发布时间】:2016-07-06 16:37:42
【问题描述】:
我想通过函数调用创建一个我只会使用一次的对象。
我尝试过的两种方法给出了相同的结果,但由于我是 C++ 新手,我不确定它们是否合适。
#include <iostream>
using namespace std;
struct Foo {
Foo(const int x, const int y): x(x), y(y) {};
Foo(Foo & myfoo): x(myfoo.x), y(myfoo.y) {
cout << "copying" << endl;
};
const int x, y;
};
int sum(const Foo & myfoo) {
return myfoo.x + myfoo.y;
}
Foo make_foo(const int x, const int y) {
Foo myfoo (x, y);
return myfoo;
}
int main () {
// version 1
cout << 1 + sum(Foo(2,3)) << endl;
// version 2
cout << 1 + sum(make_foo(2,3)) << endl;
}
以下哪种方法“更正确”?有什么不同?我用 gcc 和 clang 运行了上面的代码,两次都得到了
6
6
这意味着复制构造函数没有被调用。
相关: Calling constructors in c++ without new
编辑:谢谢,我已经知道 RVO。我只是想知道一种方法是否比另一种更受欢迎
【问题讨论】:
-
我的猜测是编译器通过内联优化
make_foo(因为它没有做任何有意义的事情)。在这种情况下,make_foo甚至没有包含任何程度的复杂含义,我会使用Foo(2,3) -
旁注:为了最佳实践,您的复制构造函数应该通过
const Foo&
标签: c++