当前位置: 首页 > 知识库问答 >
问题:

是否需要诊断非类型模板参数中的缩小转换?

汪深
2023-03-14

这几乎可以肯定是gcc错误的一个重复,在非类型模板参数中不诊断缩小转换吗?但它并没有提供令人满意的答案。答案并没有说明GCC不提供诊断是否错误,只是给出了一个在某种程度上可以替代的警告标志。

本标准的相关章节:

§14.3.2/5

对于整数或枚举类型的非类型模板参数,应用转换常量表达式(5.19)中允许的转换。

§5.19/3

类型T的转换常量表达式是一个字面常量表达式,隐式转换为类型T,其中字面常量表达式中允许隐式转换(如果有),且隐式转换序列仅包含用户定义的转换、左值到右值的转换(4.1)、积分提升(4.5),除窄化转换(8.5.4)外的积分转换(4.7)

该标准解决了缩小转换会使程序格式错误的情况,但这里有一个明显的遗漏,因此编译器不同意(GCC不提供诊断,Clang使其成为错误,MSVC也不提供诊断。)标准中是否有语言说明对于这种情况,需要诊断(即格式错误)?

#include <array>

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

共有1个答案

胡意致
2023-03-14

截至n3337,措辞已被修改,以明确结果是不正确的。(§14.3.2/5):

对用作非类型模板参数的每个表达式执行以下转换。如果无法将非类型模板参数转换为相应模板参数的类型,则程序的格式不正确。

由于它规定程序格式不正确,并且没有给予相反的具体许可,因此违反此规定需要进行诊断(根据§1.4/1):

可诊断规则集包括本国际标准中的所有语法和语义规则,但包含明确表示“无需诊断”或被描述为导致“未定义行为”的规则除外

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

 类似资料:
  • 这有道理。由于gcc确实用诊断实例化,所以我怀疑这是一个gcc bug。是这样吗?还是这段代码不需要诊断?

  • OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以RAII的方式处理它们。函数对类似于和。但是,也有一些函数对适用于资源数组,例如和。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。然而,我注意到有时我只使用一个缓冲区或纹理,在那里我不必承担向量的费用,我想如果发布函数在开始时采用大小参数,我会专门化类析构函数,但是... 对于上述SSCCE g树

  • 我正在学习C 17非类型模板参数的新功能。我编写了一个简单的代码片段,如下所示: 据我所知,福 但是,语句使用clang、MSVC 19.27编译,但在GCC 10.2、MSVC 19.25编译时失败。 我的问题是:为什么编译器的行为不同?标准对此有何规定? 链接到编译器资源管理器: 叮当声https://godbolt.org/z/66M695 海湾合作委员会https://godbolt.or

  • 也许我累了,但是我被这个简单的局部特化卡住了,它不起作用,因为指定模板参数: 将替换为,或没有帮助。那么这种专门化是否可能呢?

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • 怎样从当前数据库的状态来判断是否需要读写分离,最好经验丰富的老师来回答下。 我当前想到的是,是否可以通过 QPS/TPS 的值来判断呢?