统一初始化语法或类型转换?

时间:2014-08-06 16:50:20

标签: c++11 type-conversion uniform-initialization

将parens更改为花括号似乎在我的程序中产生完全相同的行为,即使在语义上它们似乎是完全不同的野兽。是否有理由(内存使用,性能等)更喜欢一个?

double pie = 3.14159;

myVal = int(pie); // type conversion using operator()
myVal = int{pie}; // uniform initialization syntax

[编辑]

我的实际代码与上面的示例略有不同,也许这解释了缩小的问题:

int32_t result;

myVal = uint16_t(result);  // myVal is between 0 and 65535
myVal = uint16_t{result};  // myVal is between 0 and 65535

1 个答案:

答案 0 :(得分:1)

首先请注意,您在那里做的不是初始化,是一个类型转换后跟一个赋值。我强烈建议使用C ++强制转换操作符(在本例中为static_cast)而不是C强制转换和基于构造函数的强制转换。

那就是说,统一初始化和另一个之间的主要区别在于统一初始化不允许(参见注释)缩小转换,这样你正在做的,浮动到int。这在写常量或初始化变量时很有用,因为用int初始化3.141592654根本没有任何意义,因为小数部分将被剥离。

注意:我记得有关统一初始化的初步建议明确声明禁止缩小转化次数,所以如果我理解正确,那么像你这样的代码就不应该编译。
I have tested it似乎编译器会对缩小转换而不是中止编译发出警告。实际上,这些警告也很有用,你总是可以使用-Werror标志。