假设我有一个对象
class A {
public:
int bar();
};
A foo() {return A();}
int A::bar() {return 5;}
然后我这样做:
int i = foo().bar();
为foo()
返回时创建的临时值调用了什么构造函数?
答案 0 :(得分:1)
代码是:
A foo() {return A();}
调用foo()
时,效果序列为:
A()
使用A
的默认构造函数创建的临时文件。A
的返回值对象,其中步骤1的临时为参数(即,如果存在,则移动构造函数,否则复制构造函数)。但是这是一个copy elision上下文,因此编译器可能会将所有3个步骤合并为一个,并使用A
的默认构造函数创建返回值对象。
返回值对象会发生什么取决于调用代码的作用。可能还有进一步的复制省略。在用法中:
int i = foo().bar();
没有其他事情发生;在返回值对象上调用bar()
,将值赋给i
,然后销毁返回值对象。
答案 1 :(得分:0)
如果您正在使用C ++ 11进行编译,则在foo
运行时return A()
内部调用默认构造函数。然后当它从foo move constructor
返回时被调用。但如果您使用旧版本进行编译,则首先调用默认构造函数,然后调用复制构造函数。
答案 2 :(得分:0)
调用默认构造函数。也许这样做会让它更清晰:
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A's default ctor" << endl;
}
};
int main() {
A a;
return 0;
}