缩小转化差异

时间:2017-06-28 10:01:18

标签: c++ c++11 uniform-initialization

使用g ++和clang都可以编译

std::vector<int> xs{1, 2, 3u};

但编译

并不合适
std::vector<int> xs{1, 2, 3.0};

这个看似奇怪的选择背后的理由是什么?

如果我们考虑最后一个值的类型,则unsigneddouble无法安全地转换为int,如果我们考虑 3u3.0的特定字面值可以安全地转换。

为什么区别呢?

正式规范指出,如果可以表示值,则允许从整数或枚举转换为不同的转换,甚至允许从丢失数据的文字转换(例如doublefloat) 。有趣的是,这导致:

 std::vector<float> x{1073741824};  // ok, value can be represented
 std::vector<float> y{1073741823};  // not ok, narrowing
 std::vector<float> z{1073741823.}; // ok (even if loses precision!)
 std::vector<int> w{3.0};           // not ok, just because

1 个答案:

答案 0 :(得分:2)