【发布时间】:2016-06-14 15:10:13
【问题描述】:
为什么输出 foo3 等于 3 ?
我建议,当调用bar(foo1) 时,函数bar 在堆栈上创建foo1 的副本,因此它的值等于0,当返回此值时,foo3 的复制构造函数递增值再次,所以它应该是 2?
提前致谢。
这是我的代码:
#include <iostream>
struct Foo {
Foo()
: x(0)
{
}
Foo(const Foo& foo)
: x(foo.x + 1)
{
}
int x;
};
Foo bar(Foo foo)
{
foo.x++;
return foo;
}
int main()
{
Foo foo1;
Foo foo2 = foo1;
std::cout << "A:" << foo1.x << std::endl;
std::cout << "B:" << foo2.x << std::endl;
Foo foo3 = bar(foo1);
std::cout << "C:" << foo3.x << std::endl;
}
输出:
A:0
B:1
C:3
【问题讨论】:
-
了解RVO and NRVO。
-
也许使用调试器并在复制构造函数中放置一个断点会有所帮助。
-
像
Foo bar(Foo& foo)这样的bar定义会产生输出C:2 -
@AlokSave NRVO / RVO 在变量是函数参数时不适用。如果 bar 是:
Foo bar(Foo const& foo){ Foo foo2(foo); foo2.x ++ ; return foo2; },那么编译器将被允许进行复制省略,在这种情况下,现代编译器可能会给出:A:0 B:1 C:2 -
如果他们回答了您的问题,请将其中一个答案标记为已接受。