首页 > 解决方案 > C++ 对象构造——直接初始化与使用“=”操作符,它们是等价的吗?

问题描述

在 C++ 中,这两种初始化类对象的方式在功能上是等效的,还是在某些情况下它们可能具有不同的语义并生成不同的代码?

SomeClass foo(1,2,3);

对比

auto foo = SomeClass(1,2,3);

标签: c++initializationcopy-initializationdirect-initialization

解决方案


第一个是直接初始化

第二个是拷贝初始化,概念foo上是从直接初始化的临时拷贝初始化SomeClass。(顺便说一句,它与 无关operator=;它是初始化但不是赋值。)

由于强制复制省略(自 C++17 起),它们具有完全相同的效果,对象由适当的构造函数直接初始化。

在对象的初始化中,当初始化表达式是与变量类型相同的类类型(忽略cv-qualification )的纯右值时:

T x = T(T(f())); // only one call to default constructor of T, to initialize x

在 C++17 之前,复制省略是一种优化;即使复制/移动构造可能被省略,适当的复制/移动构造函数也必须可用;如果不是(例如,构造函数被标记为explicit),则第 2 种样式将不起作用,而第 1 种样式很好。

这是一种优化:即使它发生并且/move (since C++11)没有调用复制构造函数,它仍然必须存在且可访问(好像根本没有发生优化),否则程序是错误的:


推荐阅读