我使用 Visual Studio Professional 2012。我成功预编译了一个类(头文件和源代码)。几天后,当编译另一个正在使用前一个类的类(暂时只有头文件)时,编译器发现缺少引用if(this != &rhs)
和分号rhs.root = nullptr;.
也许这是我的天真和对编译器如何工作的知识缺乏了解,但我认为编译器很健壮,可以捕获诸如此类的错误。在我看来,只有在需要特定代码块时,编译器才会觉得需要检查它。
我已经阅读了有关即时编译的内容,并了解了汇编编译器如何先使用符号然后使用语法执行两遍编译。我没有在我的大学上过编译器构建课程,我知道这些课程可以很好地了解解析器等。
未能捕获错误的代码部分是此移动赋值运算符:
Tree &operator=(Tree &&rhs)
{
if(this != rhs) <--------- no reference to the rhs
{
root = std::move(rhs.root);
rhs.root = nullptr <----------- no semicoln
}
return *this;
}
这些错误是在编译 boost 变体以及我的访问者类成员时生成的:
bool operator() (Tree<std::string>& tree) const {
return tree.load(tree);
}
以及与提升序列化相关的许多其他错误。当然,修复是为了更正缺少的引用和分号,但我想了解为什么只有在编译器需要接触此代码时才明显捕获它?