假设你有这样的功能:
Foo foo() {
Foo foo;
// more lines of code
return foo; // is the copy constructor called here?
}
Foo bar() {
// more lines of code
return Foo(); // is the copy constructor called here?
}
int main() {
Foo a = foo();
Foo b = bar();
}
当任何函数返回时,是否调用了复制构造函数(假设会有一个)?
答案 0 :(得分:10)
可能会被调用,或者可能不会被调用。在两种情况下,编译器都可以选择使用返回值优化(尽管优化在bar
中比在foo
中更容易。)
即使RVO取消了对复制构造函数的实际调用,仍必须定义复制构造函数并使其可访问。
答案 1 :(得分:8)
取决于是否应用Return Value Optimization。
答案 2 :(得分:2)
可以调用。它也可以被优化掉。以同一方向查看一些other question。