Самостоятельная ссылка в строительстве

Я только что обнаружил, что следующий код компилируется как с gcc 5.4, так и с компилятором Intel 18.0.2. Clang 6.0.0 просто дает предупреждение.

#include <vector>

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

  return 0;
}

У меня была ошибка в моем коде, которая была очень похожа, и я боюсь, что этот код может скомпилироваться. Мой вопрос:

  • Является ли это законным C++? Если да, что он должен делать?
  • Как поймать эти "ошибки" во время компиляции?

Ответ 1

Является ли это законным C++? Если да, что он должен делать?

Это хорошо сформированная программа, но она демонстрирует Undefined Behavior, потому что она читает неинициализированную переменную. Это означает, что нет никаких ограничений на его поведение (он может юридически делать буквально все).

Как поймать эти "ошибки" во время компиляции?

Включите достаточное количество предупреждений и создайте с помощью "обработать предупреждения как ошибки". При наличии достаточного количества предупреждений gcc 5.4 улавливает его правильно. Обратите внимание, что в случае gcc это также требует оптимизации поворота, поскольку gcc делает некоторые анализы (например, неиспользуемые переменные) только при оптимизации.