使用g ++和clang都可以编译
std::vector<int> xs{1, 2, 3u};
但编译
并不合适std::vector<int> xs{1, 2, 3.0};
这个看似奇怪的选择背后的理由是什么?
如果我们考虑最后一个值的类型,则unsigned
和double
无法安全地转换为int
,如果我们考虑 3u
和3.0
的特定字面值可以安全地转换。
为什么区别呢?
正式规范指出,如果可以表示值,则允许从整数或枚举转换为不同的转换,甚至允许从丢失数据的文字转换(例如double
到float
) 。有趣的是,这导致:
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