【问题标题】:G++ 4.5 Bug: No diagnostic for narrowing in initializer listG++ 4.5 错误:没有诊断缩小初始化列表
【发布时间】:2010-08-22 13:37:24
【问题描述】:

我尝试了以下代码:

int main()
{
   int x {23.22};
}

其中包括需要缩小范围的初始化,但代码编译良好,没有任何错误或警告。另一方面,以下代码给出错误:

int main()
{
   int x[]{23.22};
}

我发现了错误还是什么?

PS:我目前使用的是 GCC 4.5.0

【问题讨论】:

  • 两者对于 C++98 来说似乎都是不正确的

标签: c++ g++ c++11 narrowing


【解决方案1】:

看起来像一个错误。以下内容直接来自草案 n3092:

8.5.4 列表初始化

——否则,如果初始化列表 有一个元素,对象是 从该元素初始化;如果一个 缩小转换(见下文)是 需要将元素转换为 T, 程序格式不正确。

int x1 {2}; // OK
int x2 {2.0}; // error: narrowing

您可以查看 GCC 的 C++0X 合规性here. 初始化列表 (N2672) 的状态为“是”——但请注意,这只是实验性的(因此您可能会遇到错误)。

bug report 更新:GCC 确实发出带有-Wconversion 标志的警告(不,这不在-Wall 中)。

【讨论】:

  • 这个特性我知道,但它也提到如果有可能发生变窄,初始化应该会失败,不是吗?
  • 该表列出了实现的功能,但没有列出哪些功能实现得很好。版本 4.4.1 似乎在新的初始化语法和初始化列表中挣扎得很厉害,不确定 4.5 是否更好
  • @UncleBens:这些是实验版本;我不希望这些构建具有最高质量。
  • @dirkgently:那么,GNU 的页面不应该说明这些功能是否只是部分实现了?
  • @OP:您是否已经提交了错误? :-) 这是我发现的:gcc.gnu.org/bugzilla/show_bug.cgi?id=45378(其余部分)
【解决方案2】:

由于 C++0x 支持仍在实现中,即使根据标准应该有错误或警告而没有,但这并不一定是错误,只是尚未实现。如果在实施特定功能后标准草案发生了更改,也可能发生这种情况。

使用开发中的软件或标准的事实是,根据最新规范应该存在的东西不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多