编译器是否必须诊断C++模板中的语言语法违规?标准示例存疑
关于C++模板中语法错误诊断的疑问
我对[temp.res.general]中的示例7存在疑问,示例代码如下:
template<class T> class X { // ... void g(T t) { +; // may be diagnosed even if X::g is not instantiated } };
注释中的“may”表明编译器可以诊断+;这个错误,但并非必须。但就我所知,+;本身并不是有效的C++语法。
由此引出两个方向的疑问:如果编译器必须诊断该错误,对应的标准依据是什么?如果并非必须,那么像下面这类严重语法错误是否也无需诊断?
void g(T t) { +(()=/)(/)§(/)(/)/=)$§/%)=§(/&%=)§/(%)=§/%§; // diagnostic required? }}}}}}}}}}}}}}}}}}}}; // diagnostic required? }
编译器似乎需要先匹配括号才能定位语法错误的位置,这又延伸出两个具体问题:
- 语法误用是否通常仅属于IFNDR(无需诊断的错误),而非仅在模板语境下才如此?
- 是否有标准条款明确规定必须进行括号匹配检查?
说明
“语言语法违规”指标记组合违反语法规则,导致无法构成有效C++翻译单元。
核心疑问:+;不符合C++语法规则,无论是否处于模板中,编译器是否必须诊断该错误?
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

