C++11 统一初始化语法还是类型转换?

C++11 统一初始化语法还是类型转换?,c++11,type-conversion,uniform-initialization,C++11,Type Conversion,Uniform Initialization,在我的程序中,将paren改为花括号似乎会产生完全相同的行为,尽管它们在语义上似乎完全不同。是否有理由(内存使用、性能等)选择一个 double pie = 3.14159; myVal = int(pie); // type conversion using operator() myVal = int{pie}; // uniform initialization syntax [编辑] 我的实际代码与上面的示例略有不同,这或许可以解释缩小范围的问题: int32_t result;

在我的程序中,将paren改为花括号似乎会产生完全相同的行为,尽管它们在语义上似乎完全不同。是否有理由(内存使用、性能等)选择一个

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

首先请注意,您在那里所做的不是初始化,而是类型转换,然后是赋值。我强烈推荐C++编译器操作符(在这里是代码> STATICORCAST < /代码>)。 也就是说,统一初始化与其他初始化之间的主要区别在于,统一初始化不允许(参见注释)缩小转换范围,例如将浮点转换为int。这在写入常量或初始化变量时非常有用,因为用
3.141592654
初始化
int
毫无意义,因为小数部分将被去掉

注意:我记得统一初始化的最初建议明确指出它不允许缩小转换范围,因此如果我理解正确,像您这样的代码不应该编译。

而且似乎编译器会发出关于缩小转换范围的警告,而不是中止编译。事实上,警告也很有用,您可以一直使用
-Werror
标志。

还有一些关于统一初始化和隐式转换构造函数的内容,但我记不清了