通用和统一的初始化:`double` 到 `int`
universal and uniform initialization: `double` to `int`
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
即通用统一初始化可以在编译模式下检查值(从int
到char
)。 Bjarne Stroustrup 在他的书中提到了这个案例。
我预计这对于 double
到 int
的情况是正确的,但它不适用于 Visual Studio 2015 更新 3 :
constexpr double cd {4.0};
int i1 {cd}; // compilation error
错误信息:
C2397 conversion from 'double' to 'int' requires a narrowing
conversion
这是正确的行为(对于我的第二个代码示例)还是特定于 Visual Studio?
double
到 int
的转换总是被认为是缩小的,这就是为什么 Bjarne Stroustrup 在他的书中为这种转换创建了一个 narrow_cast<>
实现。
从 double 到 int 的转换正在缩小,因为 double 代表有理数。 (0.5) 由于不需要精确(1. 可以是 1.000000001),转换会丢失信息。
对此类转换使用显式强制转换,一切都会好起来的,或者不要使用通用初始化。
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
即通用统一初始化可以在编译模式下检查值(从int
到char
)。 Bjarne Stroustrup 在他的书中提到了这个案例。
我预计这对于 double
到 int
的情况是正确的,但它不适用于 Visual Studio 2015 更新 3 :
constexpr double cd {4.0};
int i1 {cd}; // compilation error
错误信息:
C2397 conversion from 'double' to 'int' requires a narrowing conversion
这是正确的行为(对于我的第二个代码示例)还是特定于 Visual Studio?
double
到 int
的转换总是被认为是缩小的,这就是为什么 Bjarne Stroustrup 在他的书中为这种转换创建了一个 narrow_cast<>
实现。
从 double 到 int 的转换正在缩小,因为 double 代表有理数。 (0.5) 由于不需要精确(1. 可以是 1.000000001),转换会丢失信息。
对此类转换使用显式强制转换,一切都会好起来的,或者不要使用通用初始化。