c++ - C++中通过函数调用创建对象

标签 c++

我想创建一个对象,我只打算通过函数调用使用一次。

我尝试过的两种方法给出了相同的结果,但由于我是 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。我只是想知道是否一种方法优于另一种方法

最佳答案

在这种情况下,这两种方法是等价的。

您正在观察的是 Copy elision ,或更具体地说 Return Value Optimization .

编译器足够聪明,可以识别您不需要构造中间实例,因为您只是要复制然后销毁它。因此,它只是创建作为函数返回目标的最终实例。

语言标准明确允许这种优化,即使这意味着您的复制构造函数被绕过。换句话说,无法保证调用复制构造函数的功能。

关于c++ - C++中通过函数调用创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38229217/

相关文章:

c++ - 使用数组下标运算符访问结构成员

C++ 错误 : no matching function for call to 'regex_match()'

c++ - Visual Studio 2012 缺点/优点的单元测试框架

c++ - 使用此 CMake 链接命令仍然需要针对 OpenMP::OpenMP_CXX 的显式链接吗?

C++ 内联汇编错误

c# - 从非托管 C 库访问 C# 方法是否安全?

c++ - 需要 C 和 C++ 中的未定义行为吗?

c++ - 段错误(代码已转储)

c++ - 当 S 是 T 的普通子类时,在需要 T 数组的地方使用 S 数组是否安全?

c++ - 这是通用引用吗? std::forward 在这里有意义吗?