在这种情况下调用什么构造函数?

时间:2016-08-10 20:26:21

标签: c++ c++11

假设我有一个对象

class A {
    public:
    int bar();
};

A foo() {return A();}
int A::bar() {return 5;}

然后我这样做:

int i = foo().bar();

foo()返回时创建的临时值调用了什么构造函数?

3 个答案:

答案 0 :(得分:1)

代码是:

A foo() {return A();}

调用foo()时,效果序列为:

  1. A()使用A的默认构造函数创建的临时文件。
  2. 使用复制/移动构造函数创建的类型A的返回值对象,其中步骤1的临时为参数(即,如果存在,则移动构造函数,否则复制构造函数)。
  3. 第1步的临时性被破坏。
  4. 但是这是一个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;
}