1

我使用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); 
} 

以及提高系列化相关的其他错误的主机。当然,修正是纠正缺少的引用和分号,但我想明白为什么只有在编译器需要触摸此代码时才明显地捕获它。

+2

在本文中有很多不同的问题,你应该把它们分开,并为每个主题提出一个问题。 – inf 2013-03-28 11:26:05

+0

请编辑您的问题以包含更完整的代码示例,因为很难理解代码中可能出现了什么问题,并了解编译器为何无法捕获它。 – 2013-03-28 11:26:29

+1

这里有很多误解。 “即时”编译与消除/忽略不可达代码不同。另外,现代编译器不是“单通”或“双通”,你需要一大堆通行证才能通过体面的错误报告实现最先进的功能。 (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

回答

2

它是模板类吗?

因为模板的语义分析只有在实例化时才有意义。也就是说,如果它是模板,编译器应该在缺少分号(语法错误)时生成错误,但不会在==操作符处生成错误。

下面的代码编译使用g ++:

template<typename T> 
struct A { 
     void q(A &a) { 
       if (this == a) {} 
     } 

}; 

int main(int argc, char **argv) { 
     A<int> x; 
     //x.q(x); 
} 

但当

 x.q(x); 

未被注释不编译。

+0

它是一个模板类;以及外部类是一个模板类,内部类共享外部类模板类型。 – Mushy 2013-03-28 14:24:27