|
|
1
10
当标准说“不需要诊断”时,这意味着编译器不必产生关于无效代码的错误或警告,但是根据标准,代码的行为仍然是未定义的,因此它不一定有可预测的结果。这是为了让编译器编写人员更容易操作,这样他们就没有义务检测相对较少或特别麻烦的程序员错误。 但是,如果违反了“不需要诊断”的规则,则编译器不会 禁止 从检测到无效代码和产生错误作为对用户的礼貌。因此,在给出的示例中,GCC正在为一种特定类型的无效代码生成一个礼貌诊断,而COMEAU正在为类似类型的无效代码生成一个礼貌诊断。但不需要进行任何诊断,因此在任何情况下,其他编译器都不生成错误消息,从而违反了标准。在任何情况下,代码的行为都是未定义的。 关于类名和模板名的几个相关标准引用: 3.4/1
7.1.3/3
91/2
14/5
145.4/1
因此,总结如下:
所以这两个方向都有冲突。这个
|
|
2
4
不是。如果代码无效,那么它就是无效的。 短语 无需诊断 当应用到语法或语义规则时,意味着如果您的程序违反了规则,编译器不必发出错误消息,它可以继续编译程序(或者它可以做任何其他事情,真的;如果您给编译器一个违反了此规则的程序,则该标准对编译器没有任何要求)。 从某种意义上说, 无需诊断 有点像 未定义的行为 语义规则:如果您违反了不需要诊断的规则,则所有赌注都将取消。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |