我们可以在 C++ 中通过两种方式初始化变量
一:
int abc = 7;
二:
int abc {7};
这两种方法有什么区别?编译器对它们的处理方式是否不同,或者代码的执行方式是否存在差异?
原文由 techfun 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们可以在 C++ 中通过两种方式初始化变量
一:
int abc = 7;
二:
int abc {7};
这两种方法有什么区别?编译器对它们的处理方式是否不同,或者代码的执行方式是否存在差异?
原文由 techfun 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
精简版
通过
{..}
初始化是列表初始化,它禁止缩小转换。例如,如果LLONG_MAX
是long long int
的最大值,而您的int
不能表示:相似地:
长版
表单的初始化
是 _复制初始化_;任一形式的初始化
是 _直接初始化_,[dcl.init]/15-16。
[dcl.init]/14 然后说:
所以对于非类类型,初始化的 形式 无关紧要。但是,这两个直接初始化之间是有区别的:
同样,在这两个复制初始化之间:
即带有
{..}
的使用列表初始化。{..}
被称为 _支撑初始化列表_。因此,当您将
T x = a;
与T x {a};
进行比较时,有 两个 区别:复制与直接初始化,以及“非列表”与列表初始化。正如其他人和上面的引用已经提到的那样,对于非类类型T
,复制和直接初始化之间没有区别。但是,list-init 和没有 list-init 之间是有区别的。也就是说,我们也可以比较在这种情况下,列表初始化禁止缩小转换。 [dcl.init.list]/7 中定义了缩小转换: