gpt4 book ai didi

c++ - 编译器的健壮性……天真

转载 作者:行者123 更新时间:2023-11-30 04:19:43 25 4
gpt4 key购买 nike

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

也许这是我的天真和缺乏关于编译器如何工作的知识,但我认为编译器很健壮,可以捕获诸如此类的错误。在我看来,只有当需要特定代码块时,编译器才会觉得有必要检查它。

我已经阅读了有关即时编译的内容,并了解了汇编编译器如何先使用符号然后使用语法执行两次编译。我没有在我的大学上过编译器构造的类(class),我知道这些类(class)可以让我深入了解解析器等。

未能捕捉到错误的代码部分是这个移动赋值运算符:

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

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

最佳答案

它是模板类吗?

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

以下代码使用 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);

未注释。

关于c++ - 编译器的健壮性……天真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15680478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com