施工中的自我参考

Ins*_*oop 17 c++

我刚刚发现以下代码与gcc 5.4和Intel编译器18.0.2一起编译.Clang 6.0.0只是发出警告.

#include <vector>

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 它是合法的C++吗?如果是的话,该怎么办?
  • 如何在编译时捕获这些"错误"?

Rei*_*ica 10

它是合法的C++吗?如果是的话,该怎么办?

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

如何在编译时捕获这些"错误"?

启用足够的警告并使用"将警告视为错误"进行构建.有足够的警告,gcc 5.4正确捕获它.请注意,在gcc的情况下,这也需要开启优化,因为gcc仅在优化时进行一些分析(例如未使用的变量).

  • @InsideLoop有些人可能会说,你不打开所有警告并将它们视为默认错误是可怕的:P (7认同)