施工中的自我参考

时间:2018-05-04 07:13:11

标签: c++

我刚刚发现以下代码使用gcc 5.4和Intel编译器18.0.2进行编译。 Clang 6.0.0只是发出警告。

#include <vector>

int main() {
  std::vector<double> v = v;

  return 0;
}

我的代码中有一个非常相似的错误,我担心这些代码可以编译。我的问题是:

  • 这是合法的C ++吗?如果是,它应该做什么?
  • 如何在编译时捕获这些“错误”?

1 个答案:

答案 0 :(得分:10)

  

这是合法的C ++吗?如果是,它应该做什么?

它是一个结构良好的程序,但它展示了未定义的行为,因为它读取了未初始化的变量。这意味着它的行为没有任何限制(它可以合法地做任何事情)。

  

如何捕捉那些&#34;错误&#34;在编译时?

启用足够的警告并使用&#34;将警告视为错误。&#34;有足够的警告,gcc 5.4 catches it correctly。请注意,对于gcc,这也需要开启优化,因为gcc仅在优化时才进行一些分析(例如未使用的变量)。