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

标签 c++ c++11

假设我有一个对象

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

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

然后我这样做:

int i = foo().bar();

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

最佳答案

代码是:

A foo() {return A();}

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

  1. A() 使用 A 的默认构造函数临时创建。
  2. 返回类型为 A 的值对象 使用复制/移动构造函数创建,步骤 1 的临时值作为参数(即,如果存在则移动构造函数,否则复制构造函数) .
  3. 第 1 步中的临时对象被销毁。

然而这是一个copy elision上下文,因此编译器可能会将所有 3 个步骤合并为一个,并使用 A 的默认构造函数创建返回值对象

返回值对象 会发生什么取决于调用代码的作用。可能还有进一步的复制省略。在使用上:

int i = foo().bar();

没有其他事情发生;在返回值对象上调用bar(),将值分配给i,然后销毁返回值对象。

关于c++ - 在这种情况下调用什么构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38882921/

相关文章:

c++ - std::thread::detach 在原始调用者被销毁后导致崩溃

c++ - std::function 是否支持自定义分配器?

c++ - (C++) 错误 : invalid use of non-static member function ‘int Demo::addTwoNumbers(int, int)’

c++ - avcodec_encode_video2() 的随机段错误

python - 使用 OpenCV readNetFromTensorFlow : Error: Unknown layer type Shape in op decoder_stage0_upsampling/Shape 运行 Keras DNN 模型 (UNet)

c++ - 实现一个没有未定义行为的类似 std::vector 的容器

c++ - 使用 Clang 的 scan-build 和 scons 和 C++11

c++ - 如果其他人正在等待,是否有标准的 STL 或 Qt 方法来产生互斥量,否则保留它?

c++ - 多次等待同一个锁

c++ - Ranged for loop const 引用似乎没有什么区别