【问题标题】:Narrowing conversion of list initialization is an error or just a warning? [duplicate]缩小列表初始化的转换是错误还是只是警告? [复制]
【发布时间】:2015-12-22 14:50:03
【问题描述】:

目前我正在自学 C++ 入门第 5 版。文字说:

当与内置类型的变量一起使用时,这种形式的初始化有一个 重要属性:编译器不会让我们列出内置类型的初始化变量,如果 初始化器可能会导致信息丢失:

示例代码如下:

long double ld = 3.1415926536;
int a{ld}, b = {ld}; // error: narrowing conversion required
int c(ld), d = ld; // ok: but value will be truncated

但是当我自己在 C++shell 上尝试时:

long double a=3.14159265354;
 int b(a);
 int c{a};
 std::cout<<a<<std::endl<<b<<std::endl<<c<<std::endl;

它只是给出-Wnarrowing的警告,但程序成功执行。为什么?

【问题讨论】:

  • 一般来说,对于违反语言规则的行为,C++ 标准要求编译器发出诊断。它做到了。该标准不区分警告和错误,并且在发出诊断后不需要任何特定行为。
  • @PeteBecker 哦,谢谢你指出!
  • @NathanOliver 我确实尝试在常见问题解答中找到答案,但考虑到他的问题标题,这非常困难。不管怎样,下次我会尽量小心一点。

标签: c++ implicit-conversion


【解决方案1】:

标准规定,如果程序格式错误,则需要诊断。当窄化转换发生在大括号初始化器中时就是这种情况。

也就是说,标准不区分错误和警告。

1.3.6 诊断消息 [defns.diagnostic]

属于实现定义的子集的消息 实现的输出消息

【讨论】:

  • 感谢您的解释。我认为这个问题应该已经结束了..
  • @Des1gnWizard 您可以通过接受此答案有效地“关闭”问题。只需单击左侧的空心复选标记,它就会变为绿色。
  • @Dialectus 非常感谢您指出这一点.....谢谢..
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2014-01-28
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多