给出以下C ++代码:
struct foo {
// Some definition with copy constructor.
};
const foo &getData();
const foo &alt1(getData());
const foo &alt2 = getData();
合理的编译器会为alt1
和alt2
生成不同的代码吗?换句话说,alt1
会导致复制构造函数运行,还是允许编译器优化它并直接分配引用?
答案 0 :(得分:5)
在这两种情况下,您都初始化引用(而不是对象),因此不会运行任何复制构造函数。
答案 1 :(得分:2)
const foo &alt1(getData());
const foo &alt2 = getData();
这两个完全一样。这里没有副本,有或没有优化。
答案 2 :(得分:2)
没有。在您的代码中,alt1
和alt2
是对getData()
返回的对象的引用。因此,不会创建任何对象,因此不存在复制构造函数调用的问题。
答案 3 :(得分:0)
只是为了完成这些答案,如果getData()的签名是“foo getData();”那么即使大多数编译器没有生成任何调用,你也需要一个复制构造函数来退出并可以访问它。