C++11 统一初始化语法还是类型转换?
在我的程序中,将paren改为花括号似乎会产生完全相同的行为,尽管它们在语义上似乎完全不同。是否有理由(内存使用、性能等)选择一个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;
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
标志。还有一些关于统一初始化和隐式转换构造函数的内容,但我记不清了