1
10
当标准说“不需要诊断”时,这意味着编译器不必产生关于无效代码的错误或警告,但是根据标准,代码的行为仍然是未定义的,因此它不一定有可预测的结果。这是为了让编译器编写人员更容易操作,这样他们就没有义务检测相对较少或特别麻烦的程序员错误。 但是,如果违反了“不需要诊断”的规则,则编译器不会 禁止 从检测到无效代码和产生错误作为对用户的礼貌。因此,在给出的示例中,GCC正在为一种特定类型的无效代码生成一个礼貌诊断,而COMEAU正在为类似类型的无效代码生成一个礼貌诊断。但不需要进行任何诊断,因此在任何情况下,其他编译器都不生成错误消息,从而违反了标准。在任何情况下,代码的行为都是未定义的。 关于类名和模板名的几个相关标准引用: 3.4/1
7.1.3/3
91/2
14/5
145.4/1
因此,总结如下:
所以这两个方向都有冲突。这个
|
2
4
不是。如果代码无效,那么它就是无效的。 短语 无需诊断 当应用到语法或语义规则时,意味着如果您的程序违反了规则,编译器不必发出错误消息,它可以继续编译程序(或者它可以做任何其他事情,真的;如果您给编译器一个违反了此规则的程序,则该标准对编译器没有任何要求)。 从某种意义上说, 无需诊断 有点像 未定义的行为 语义规则:如果您违反了不需要诊断的规则,则所有赌注都将取消。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |