我使用Visual Studio Professional 2012。我成功地预编译了一个类(头文件和源代码)。几天后,当编译另一个使用前一个类的类(仅用于moment标头)时,编译器捕获到缺少引用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);
}以及与boost序列化相关的许多其他错误。当然,修复的方法是更正缺少的引用和分号,但我想知道为什么只有在编译器需要接触这段代码时才能捕捉到这一点?
发布于 2013-03-28 21:36:54
它是一个模板类吗?
因为模板的语义分析只有在它们被实例化时才有意义。也就是说,如果它是一个模板,编译器应该在缺少分号的位置(语法错误)生成错误,而不是在==操作符生成错误。
以下代码使用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);是未注释的。
https://stackoverflow.com/questions/15680478
复制相似问题