|
|
1
230
C++ 17更新
在C++ 17中,意思是
例如,在我们的案例中,
取决于什么类型
这样做是因为它是一个内置类型(这意味着这里不是类类型)。读 86/14 .
这样做是不一样的。如果
深入研究初始化 直接和复制初始化 虽然它们看起来是相同的,应该是相同的,但在某些情况下,这两种形式是显著不同的。初始化的两种形式是直接初始化和复制初始化:
我们可以将行为归因于它们中的每一个:
如你所见, 复制初始化 在某种程度上是关于可能的隐式转换的直接初始化的一部分:而直接初始化具有所有可调用的构造函数,并且 此外 可以进行任何隐式转换,它需要匹配参数类型,复制初始化只能设置一个隐式转换序列。
我努力尝试过
got the following code to output different text for each of those forms
不使用“明显”的
它是如何工作的,为什么输出这个结果?
我希望这有助于更清楚地说明这两种形式的区别! |
|
2
44
转让 不同于 初始化 . 以下两行都可以 初始化 . 单个构造函数调用完成:
但这并不等同于:
我现在没有文本来证明这一点,但是很容易实验:
|
|
|
3
15
请查看以下代码以查看区别:
如果类没有显式构造,则显式和隐式调用是相同的。 |
|
|
4
5
值得注意的:
〔12.2/1〕
也就是说,用于复制初始化。
〔12.8/15〕
换句话说,一个好的编译器会 不 当可以避免复制初始化时,为它创建一个副本;相反,它将直接调用构造函数——即,就像直接初始化一样。 换句话说,在大多数情况下,复制初始化就像直接初始化一样<opinion>在编写了可理解代码的情况下。由于直接初始化可能会导致任意(因此可能是未知的)转换,因此在可能的情况下,我更喜欢始终使用复制初始化。(附带的好处是它看起来像初始化。)</opinion>
技术类别:
[12.2/1从上面继续]
很高兴我没有编写C++编译器。 |
|
|
5
4
第一组:取决于
第二组:完全相同的逻辑,只是内置类型没有任何外来的构造函数,所以实际上它们是相同的。
第三分组:
|
|
|
6
4
关于本部分的回答:
因为大多数答案都是前C ++ 11,所以我添加了C++ 11对此的说法:
因此,无论优化与否,它们都是符合标准的等价物。 请注意,这与其他答案所提到的是一致的。为了正确起见,只需引用标准所说的话。 |
|
|
7
1
很多这样的情况都取决于对象的实现,因此很难给出具体的答案。 考虑一下这个案子
在这种情况下,假设有一个合适的赋值运算符&初始化接受单个整型参数的构造函数,我如何实现所述方法会影响每行的行为。但是,在实现中,其中一个调用另一个以消除重复代码是常见的做法(尽管在这样简单的情况下,没有真正的目的)。 编辑:如其他响应中所述,第一行实际上将调用复制构造函数。将与分配运算符相关的注释视为与独立分配相关的行为。 这就是说,编译器如何优化代码将有它自己的影响。如果我有一个初始化构造函数调用“=”运算符-如果编译器没有进行优化,那么顶行将执行2次跳转,而不是底行中的一次跳转。 现在,对于最常见的情况,编译器将通过这些情况进行优化,并消除这种效率低下的情况。所以实际上,你描述的所有不同的情况都是一样的。如果您想确切地看到正在执行的操作,可以查看对象代码或编译器的程序集输出。 |
|
8
1
你可以看到它的区别
Classes:
而在
默认情况下,构造函数是
通过将结构定义为
|
|
AstralHex · 矩阵乘法代码工作不正常 10 月前 |
|
|
Giogre · 为包含许多数值字段的简单“struct”重载比较运算符 11 月前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 11 月前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 11 月前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 11 月前 |