通用且统一的初始化:从“double”到“int”

universal and uniform initialization: `double` to `int`

本文关键字:int double 初始化      更新时间:2023-10-16

Visual Studio 2015更新3。C++11\C++14.

对于int:

constexpr int ci1 {50};
constexpr int ci2 {500};
char c1 {ci1}; // OK
char c2 {ci2}; // compilation error

通用和统一初始化可以在编译模式下检查值(从intchar)。Bjarne Stroustrup在他的书中提到了这个案例。

我原以为情况doubleint是这样的,但它不适用于Visual Studio 2015更新3:

constexpr double cd {4.0};
int i1 {cd}; // compilation error

错误消息:

C2397从"double"到"int"的转换需要缩小转换

它是正确的行为(对于我的第二个代码示例)还是特定于Visual Studio?

doubleint的转换总是被认为是缩小的,这就是为什么Bjarne Stroustrup在他的书中为这种类型的转换创建了narrow_cast<>实现。

从double到int的转换正在缩小,因为double代表有理数。(0.5)由于不必精确(1。可能是1 000000001),转换将丢失信息。

对这样的转换使用显式强制转换,一切都会好起来,或者不使用通用初始化。

相关文章: