几乎可以肯定,这是Is gcc wrong not diagnose narrowing conversions in non-type template arguments?的重复项,但没有提供令人满意的答案。答案并没有解决GCC在不提供诊断方面是否有错,只是给出了可以替代的警告标志。

该标准的相关部分:

§14.3.2 / 5



§5.19 / 3



该标准解决了缩小转换将使程序格式错误的情况,但是这里存在明显的遗漏,因此编译器不同意(GCC不提供诊断,Clang给出此错误,MSVC也不提供诊断。)针对这种情况的标准要求进行诊断(即,格式错误)?

#include <array>

int main()
{
    std::array<int, -1> a;
}

最佳答案

从n3337开始,措词已经更改,以明确表明结果格式错误。 (第14.3.2 / 5节):



由于它指定程序格式错误,并且没有给出特定的权限,因此必须对此进行诊断(根据§1.4/ 1):



FWIW,请注意,他们还将允许的转换的定义与已转换的常量表达式的定义分开了-可能的转换现在直接在§14.3.2/ 5中列出。

关于c++ - 是否需要诊断非类型模板参数中的缩小转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26309910/

10-16 19:17