为什么不调用复制构造函数,但在此代码中调用默认构造函数
Why copy-constructor is not called but default constructor is invoked in this code?
我知道,当从已经存在的对象创建对象以及函数按值返回对象时,将调用复制构造函数。那么为什么在下面的代码中不调用复制构造函数而是调用默认构造函数呢?
class A {
public:
A() { cout << "A" << endl; }
A(A &) { cout << "A&" << endl; }
A(const A &) { cout << "const A&" << endl; }
};
A fun() {
class A a;
return a;
}
int main() {
class A a = fun(); // output: A
}
简短的回答:编译器优化。
-
首先,函数中的
a
对象直接在main
函数的作用域中创建,以避免通过函数的返回将本地参数复制(或移入 C++11)函数范围。这就是返回值优化。 -
然后,在 main 中,语句变得等效于
class A a = A()
并且再次允许编译器就地创建a
对象,而无需从临时对象复制。这是复制省略。
即使复制构造函数(完全绕过)有副作用,这也是允许的,如您的示例所示。
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用