【问题标题】:why is braced initialization not giving error when an int is initialized to floating point value? [duplicate]为什么将 int 初始化为浮点值时支撑初始化不给出错误? [复制]
【发布时间】:2018-02-16 11:23:21
【问题描述】:

我正在通过 Josée Lajoie 和 Stanley B. Lippman 的 C++ Primer 学习 C++。我读到,当使用花括号初始化变量时,如果初始化导致数据丢失,则会发生错误。

double a=5.545;
int b{a};
std::cout<<b;

但是当我运行上面的代码时,我没有收到任何错误并且输出为 5。

PS:我正在使用 CLion IDE 和 MingW C++ 编译器。

【问题讨论】:

标签: c++ c++11 initialization c++14 list-initialization


【解决方案1】:

这本书是错的。从double 构造int 是完全正常且司空见惯的,它丢失数据(所有小数部分!)。这绝不是错误。

您的编译器可能会警告您有关数据丢失的情况,前提是它可以确定会有一些数据丢失。这就是善良。但一般原则是,通过编写此代码,您实际上是在说“我想丢失小数部分”。

如果您打开“错误警告”,则任何此类警告都会转换为错误并停止构建。但这与转换本身无关。

【讨论】:

  • List-initialization 在这里不适用,因为 int 是基本类型并且没有constructor
  • @FlorianM。请阅读上面的链接,禁止的第一条是“从浮点类型转换为整数类型”。这是how clang correctly rejects OP's code,没有任何特殊警告级别。
  • @liliscent:嗯,看来你是对的 - 但是,最终结果仍然是合规的。 stackoverflow.com/a/12874041/560648
  • @liliscent 在发布答案之前,我已经仔细阅读了链接。而且我认为这里没有使用列表初始化,因为这需要一个构造函数(恕我直言)。但是还有一点,我忽略了:否则(如果 T 不是类类型),如果括号初始化列表只有一个元素,并且 T 不是引用类型或者是与兼容的引用类型元素的类型,T 是直接初始化(在直接列表初始化中)或复制初始化(在复制列表初始化中),但不允许缩小转换。 --> 所以我同意你的观点
猜你喜欢
  • 2012-10-24
  • 2011-10-29
  • 1970-01-01
  • 2020-07-23
  • 2013-09-14
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多