列表初始化时需要进行窄化转换

5

我在cpp reference网站上读到了有关缩小转换的内容。我有点理解,但我不明白的是为什么错误只存在于第一行。

    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

为什么错误只出现在第一行而不是第二行?

请记住,统一初始化是一个较新的概念。它是在经验教训的基础上设计的。同时也要记住,改变长期存在的机制的行为可能并不是微不足道的。 - François Andrieux
1个回答

5

因为编译器要求针对列表初始化(又称统一初始化),仅在缩小转换时发出诊断(在您的情况下是错误)。对于没有花括号的C++11之前的初始化,不需要诊断。

有关更多详细信息,请参见cppreference.com文档。

还请参见此答案,了解为什么编译器只需要发出警告而不一定是错误。


请注意,大多数编译器都有选项/标志可以启用,这将导致它们发出有关预C++11形式的缩小转换的诊断 - 如果您希望如此(对于gcc,这将是-Wnarrowing)。 - Jesper Juhl
这不仅仅是新语法的问题。int a[] = {ld}; 在 C++03 中是有效的,但在 C++11 中变得无效了。 - user743382
@hvd 我认为那现在也被认为是列表初始化,虽然不能确定。 - vsoftco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接