为什么此代码不生成编译错误?
Why doesn't this code generate compilation errors?
template<class T>
void foo()
{
M
}
除非我实例化它,否则Visual C++不会告诉我上面的代码包含错误。这是为什么呢?
因为视觉C++错误。 它不实现两阶段查找。 即使您不实例化模板,它也应该检查模板的语法是否正确,但它不会这样做。
海湾合作委员会不接受它。不说这必然意味着它不对,但无论如何,有一个应该发生的事情的例子。
C++标准包含对此事的非正式描述,描述了我认为是一个很好的指导方针,并被许多人认为是规范所隐含的规范性要求。
但是,实施可以指向标准的规范部分,这些部分允许它们比"明显"规则似乎声明的内容更进一步。我将在下面描述这一点。
非规范性描述
该标准允许实现在实例化模板定义之前不检查模板定义。它没有给出关于"模板定义"何时实际上应该是模板定义的正式描述,但通常的实现是执行"大括号平衡"/"括号平衡"的形式:从定义正文的最外大括号开始,计数直到你点击最后一个右大括号。介于两者之间的所有内容都将被忽略。
我想标准的一个例子进一步澄清了这一点
template<class T> class X {
// ... (omitted) ...
void g(T t) {
+; // may be diagnosed even if X::g is not instantiated
}
};
因此,早期诊断模板定义中的语法或语义错误是一种"实现质量"。
规范性描述
这些规则的质量是"无需诊断"。值得注意的是,这些规则的实现被授予不诊断格式错误的模板定义的许可证,即使模板被实例化,尽管标准的非规范性说明说了什么。如果违反了任何不需要诊断的规则,则实现可以自由地对整个程序执行任何操作。
应该注意的是,也没有语法格式错误的"模板定义",因为这个术语是由语法本身定义的。一个孤独的+
使整个封闭的上下文成为一些无意义的令牌汤。
最后但并非最不重要的一点是,委员会知道这些"漏洞",但据我所知,到目前为止还没有大多数人改变这一点。
相关文章:
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?