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从"double"到"int"的转换需要缩小转换
它是正确的行为(对于我的第二个代码示例)还是特定于Visual Studio?
double
到int
的转换总是被认为是缩小的,这就是为什么Bjarne Stroustrup在他的书中为这种类型的转换创建了narrow_cast<>
实现。
对这样的转换使用显式强制转换,一切都会好起来,或者不使用通用初始化。