首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器健壮性...天真

编译器健壮性...天真
EN

Stack Overflow用户
提问于 2013-03-28 19:21:49
回答 1查看 168关注 0票数 1

我使用Visual Studio Professional 2012。我成功地预编译了一个类(头文件和源代码)。几天后,当编译另一个使用前一个类的类(仅用于moment标头)时,编译器捕获到缺少引用if(this != &rhs)和分号rhs.root = nullptr;.

也许是我太天真,对编译器的工作原理缺乏了解,但我认为编译器对于捕获这样的错误是很健壮的。在我看来,只有当需要特定的代码块时,编译器才会觉得有必要检查它。

我已经阅读了有关即时编译的内容,并了解了汇编编译器如何执行两遍编译,首先是符号,然后是语法。我在我的大学里没有上过编译器构建的课程,我知道这样的课程对解析器等有很好的洞察力。

它未能捕获错误的代码部分是这个移动赋值操作符:

代码语言:javascript
复制
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变量以及我的访问者类成员时生成的:

代码语言:javascript
复制
bool operator() (Tree<std::string>& tree) const {
    return tree.load(tree);
}

以及与boost序列化相关的许多其他错误。当然,修复的方法是更正缺少的引用和分号,但我想知道为什么只有在编译器需要接触这段代码时才能捕捉到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-28 21:36:54

它是一个模板类吗?

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

以下代码使用g++进行编译:

代码语言:javascript
复制
template<typename T>
struct A {
        void q(A &a) {
                if (this == a) {}
        }

};

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

但在以下情况下不编译

代码语言:javascript
复制
        x.q(x);

是未注释的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15680478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档