1

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

以及与提升序列化相关的许多其他错误。当然,修复是为了更正缺少的引用和分号,但我想了解为什么只有在编译器需要接触此代码时才明显捕获它?

4

1 回答 1

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);

未注释。

于 2013-03-28T13:36:54.233 回答