编译器的健壮性…天真
Compiler Robustness ... Naivete
我使用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);
}
以及与boost序列化相关的许多其他错误。修复是,当然,纠正缺失的引用和分号,但我想了解为什么这是捕获显然只有当编译器需要触摸这段代码?
是模板类吗?
因为模板的语义分析只有在实例化时才有意义。也就是说,如果它是模板,编译器应该在缺少的分号处生成错误(语法错误),但不会在==操作符处生成错误。
用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);
注释。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 松弛原子与无同步情况下的记忆连贯性
- C++Union/Struct位域的实现和可移植性
- C++boost序列化多态性问题
- 如何更改唯一指针向量的可见性
- 获取 SFML 窗口的 HWND 和高可用性?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么 std::reduce 需要交换性?
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- C++ 优先性和关联性
- 如何实现自定义匹配器以检查 Catch2 中的对象相等性
- OpenMP for 循环并行性问题
- 混叠和指针互转换性
- 具有智能指针的多态性
- 单行函数模板 c++ 的内联性保证
- 编译器的健壮性…天真