基本类型如整数是如何初始化的?你是否有移动和复制语义,他们真的有构造函数吗?遇到以下关于直接初始化的问题时,我感到困惑:
否则,如有必要,将使用标准转换来转换 其他值为cv非限定版本的T,和初始值 正在初始化的对象的值是(可能已转换) 值。
只是说初始化对象的初始值是值,而不是如何完成。是否有一些构造函数被调用,是某些内存被移动还是会发生什么?
是否有详细解释根据上下文如何完成基本类型的初始化?我无法在标准中找到它。
答案 0 :(得分:2)
原始类型总是被复制,因为它们无法移动,尽管它们可以用于移动语义。移动语义最初用于容器,以避免在完成数据转换时销毁源对象时不必要的数据复制。原始类型不是容器,实际上你不能“转移数据所有权并将原始容器留空”,因此没有什么可移动的。如果检查由任何编译器生成的汇编代码,您将看到“move”实际上是mov
指令,这意味着数据只是从一个寄存器复制到另一个寄存器,或者在内存和注册表之间复制。由于体系结构的原因,这种行为在大多数现代CPU中大致相同。
它们没有构造函数或析构函数,因为它们不是类的实例,尽管它们的行为就像它们有虚拟的那样。
它们的初始状态,当首次定义而未被初始化时,无论是明确地还是隐含地 1 ,都是“不确定的”。你不知道它们的价值是什么,或者它是trap representation。您甚至无法对不确定的值including assuming that x == x
is true执行任何操作,这是不必要的。所以最后,基本类型的未初始化变量是无用的(除了unsigned char
或任何无符号的1字节整数等价类型)。
1。简单的隐式初始化是指在文件范围定义变量时,它将自动进行零初始化。或者,当您定义具有相同效果的静态变量时。
答案 1 :(得分:0)
基本类型没有真正的构造函数,但它们的行为(大部分)就像它们有一个一样。它们也可以从至少语义上移动 - 表现为 - 如果为它们定义了移动构造函数。当然,此举不会改变移动物体的价值。
答案 2 :(得分:0)
对于您引用的案例,标准未指定如何来初始化对象。由于as-if rule,只要最终唯一副作用是初始化对象的初始值变为(可能已转换)的值,实现就可以自由地执行任何操作。初始化程序。