是否会为此代码运行复制构造函数?

时间:2012-01-10 17:07:53

标签: c++ optimization reference copy-constructor language-lawyer

给出以下C ++代码:

struct foo {
  // Some definition with copy constructor.
};

const foo &getData();

const foo &alt1(getData());
const foo &alt2 = getData();

合理的编译器会为alt1alt2生成不同的代码吗?换句话说,alt1会导致复制构造函数运行,还是允许编译器优化它并直接分配引用?

4 个答案:

答案 0 :(得分:5)

在这两种情况下,您都初始化引用(而不是对象),因此不会运行任何复制构造函数。

答案 1 :(得分:2)

const foo &alt1(getData());
const foo &alt2 = getData();

这两个完全一样。这里没有副本,有或没有优化。

答案 2 :(得分:2)

没有。在您的代码中,alt1alt2是对getData()返回的对象的引用。因此,不会创建任何对象,因此不存在复制构造函数调用的问题。

答案 3 :(得分:0)

只是为了完成这些答案,如果getData()的签名是“foo getData();”那么即使大多数编译器没有生成任何调用,你也需要一个复制构造函数来退出并可以访问它。