考虑我们有一个类
Foo
,其中我们有一个默认构造函数和复制构造函数创建像Foo f1
和Foo f1 = Foo()
这样的对象之间有什么区别,在我的测试中它们都调用默认构造函数,它们是否保留在不同的内存中位置与指针创建的位置相同
在 C++17 之前,在
Foo f1 = Foo();
中,允许编译器创建临时 Foo
实例,然后将其移至 f1
(查找“移动语义”)。
自 C++17 起,编译器不允许创建临时(“强制复制省略”),因此两者几乎完全等效。
区别在于,对于某些类型,
Foo f1;
将使对象保持未初始化状态,而Foo f1 = Foo();
会将其归零(就像Foo f1{};
一样)。这适用于所有非类类型,以及那些没有自定义默认构造函数或在类主体内部标记为 =default
的类。