【发布时间】:2020-02-29 11:13:14
【问题描述】:
在我的标题中,我有这两个公共变量:
float testVariable1 = 1.23456789f;
float testVariable2{ 1.23456789f };
这里有什么不同? 为什么有大括号的版本?
【问题讨论】:
标签: c++ initialization
在我的标题中,我有这两个公共变量:
float testVariable1 = 1.23456789f;
float testVariable2{ 1.23456789f };
这里有什么不同? 为什么有大括号的版本?
【问题讨论】:
标签: c++ initialization
对于这种情况,它们具有相同的效果。
第一个是copy initialization,
否则(如果 T 和 other 的类型都不是类类型),则在必要时使用标准转换将 other 的值转换为 T 的 cv 非限定版本。
第二个是direct-list-initialization。
否则(如果 T 不是类类型),如果花括号初始化列表只有一个元素,并且 T 不是引用类型,或者是其引用类型与基类相同或为基类的引用类型元素的类型,T 是direct-initialized(在直接列表初始化中)或copy-initialized(在复制列表初始化中),但不允许缩小转换。
和
否则,如有必要,使用标准转换将 other 的值转换为 T 的 cv 非限定版本,并且正在初始化的对象的初始值是(可能转换的)值。
作为内置类型,潜在差异之一是list initialization 中不允许缩小转换。 (即使在这种情况下也不会应用它,因为初始化器已被指定为 float 文字。)
【讨论】:
C++ 支持三种初始化变量的基本方法。 首先,我们可以使用等号进行复制初始化:
int width = 5; // copy initialization of value 5 into variable width
这会将equals右侧的值复制到左侧正在创建的变量。 其次,我们可以使用括号直接初始化。
int width( 5 ); // direct initialization of value 5 into variable width
对于简单的数据类型(如整数),复制和直接初始化本质上是相同的。但是对于一些高级类型,直接初始化可以比复制初始化执行得更好。 在 C++11 之前,由于性能提升,在大多数情况下建议直接初始化而不是复制初始化。
不幸的是,直接初始化不能用于所有类型的初始化。为了提供更一致的初始化机制,C++11 为直接初始化添加了一种新语法,称为大括号初始化(也称为统一初始化),它使用大括号:
int width{ 5 }; // brace (uniform) initialization of value 5 into variable width
希望这会对你有所帮助。
【讨论】: