我使用Visual Studio Professional 2012.我成功地预编译了一个类(头文件和源文件)。以后的日子里,编译另一个类(仅适用于当下头)时所采用的前一个编译器捕获一个丢失的引用if(this != &rhs)
和分号rhs.root = nullptr;.
编译器鲁棒性... Naivete
也许是我的天真和知识的缺乏有关的编译器是如何工作的,但我认为编译器能够很好地捕捉这些错误。在我看来,只有当需要特定的代码块时,编译器才会觉得需要检查它。
我已阅读关于即时编译的知识,并了解程序集编译器如何首先使用符号执行两遍编译,然后再使用语法。我还没有在我的大学采取的编译器建设过程中,我知道这样的课程给予了极大的洞察解析器等
的代码部分,在那里它没能赶上错误是这一举措的赋值操作符:
Tree &operator=(Tree &&rhs)
{
if(this != rhs) <--------- no reference to the rhs
{
root = std::move(rhs.root);
rhs.root = nullptr <----------- no semicoln
}
return *this;
}
在编译升压变型,以及我的访问类成员生成的错误:
bool operator() (Tree<std::string>& tree) const {
return tree.load(tree);
}
以及提高系列化相关的其他错误的主机。当然,修正是纠正缺少的引用和分号,但我想明白为什么只有在编译器需要触摸此代码时才明显地捕获它。
在本文中有很多不同的问题,你应该把它们分开,并为每个主题提出一个问题。 – inf 2013-03-28 11:26:05
请编辑您的问题以包含更完整的代码示例,因为很难理解代码中可能出现了什么问题,并了解编译器为何无法捕获它。 – 2013-03-28 11:26:29
这里有很多误解。 “即时”编译与消除/忽略不可达代码不同。另外,现代编译器不是“单通”或“双通”,你需要一大堆通行证才能通过体面的错误报告实现最先进的功能。 (Eric Lippert [为C#概述](http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx),并且认为C++编译器更多比C#复杂,除非它不得不处理模板和优化本机代码) – millimoose 2013-04-04 01:27:20