当前位置: 首页 > 知识库问答 >
问题:

为什么列表初始化(使用花括号)比其他选项更好?

顾俊茂
2023-03-14
MyClass a1 {a};     // clearer and less error-prone than the other three
MyClass a2 = {a};
MyClass a3 = a;
MyClass a4(a);

为什么?

共有1个答案

朱自明
2023-03-14

基本上是从Bjarne Stroustrup的“C++编程语言第四版”中复制和粘贴的:

列表初始化不允许缩小(§ISO.8.5.4)。即:

  • 一个整数不能转换为另一个不能容纳其值的整数。例如,允许char to int,但不允许int to char。
  • 浮点值不能转换为无法保存其值的其他浮点类型。例如,允许float to double,但不允许double to float。
  • 浮点值不能转换为整数类型。
  • 整数值不能转换为浮点类型。
void fun(double val, int val2) {

    int x2 = val;    // if val == 7.9, x2 becomes 7 (bad)

    char c2 = val2;  // if val2 == 1025, c2 becomes 1 (bad)

    int x3 {val};    // error: possible truncation (good)

    char c3 {val2};  // error: possible narrowing (good)

    char c4 {24};    // OK: 24 can be represented exactly as a char (good)

    char c5 {264};   // error (assuming 8-bit chars): 264 cannot be 
                     // represented as a char (good)

    int x4 {2.0};    // error: no double to int value conversion (good)

}
auto z1 {99};   // z1 is an int
auto z2 = {99}; // z2 is std::initializer_list<int>
auto z3 = 99;   // z3 is an int
 类似资料:
  • Java中的双大括号初始化语法()是什么?

  • 考虑代码 输出是 据我所知,值被隐式转换为一个(第一个输出),然后初始化器构造函数开始工作(第二个输出)。我的问题是为什么会这样?标准构造函数不是更好的匹配吗?一、 例如,我本以为这个片段的输出就是ctor。 PS:如果我将构造函数标记为,那么是唯一调用的构造函数,因为整数现在不能隐式转换为。

  • 我已经在网上搜索了这个问题的答案,但我还没有找到一个满意的答案。我想知道初始化结构和类类型的对象的所有规则是什么,特别是在构造函数与带括号的初始化列表方面。结构与类的规则也不同吗? 让我们假设有一个名为矩形的类或结构。 我尝试用C语言中通常使用的方式初始化矩形r,使用一个普通的带括号的初始值设定项列表。但是,g给出以下错误: 嗯……嗯。。。。乍一看,这并不是很有用的错误消息。然而,我认为它与构造函

  • 问题内容: 通常,我将初始化一个类似的结构: 但是,我最近看到了用括号初始化的代码: 返回相同的名称。 括号中的内容起什么作用?何时首选? 这是一些Go代码可以尝试一下: 游乐场:https : //play.golang.org/p/_gsaruS_DVi 问题答案: 没什么特别的,那两行是相同的。 但是,例如,当您要在语句中使用它时,将需要使用括号,否则会出现编译时错误: 结果是: 预期的布尔

  • 问题内容: 我知道当我初始化一个char数组时: 要么 为什么不喜欢 初始化数组: 为什么它们不同?它是Java哲学的本质之一还是其​​背后的某些原因? 问题答案: 如果您曾经使用过 C ,那么答案就非常简单。在 C语言中 ,创建数组的方式是在堆栈上分配一个足以容纳元素数量的静态内存长度,并使用指针指向第一个元素-或堆上动态内存长度,然后用指针指向第一个元素。 在 C ++中 ,第二个版本已更改为