Ранее сегодня я споткнулся addition on std::atomic<double> not adding up to non-atomic counterpart, которые оказались бы из-за std::atomic<double>
Оставшись неинициализированным (см также What's the default value for a std::atomic?). Однако мое внимание привлекло то, что мой компилятор не предупредил меня о том, что std::atomic<double>
не был инициализирован. Рассмотрим:Нет компилятор предупреждения для неинициализированного станда :: атомного <double>
#include <iostream>
#include <atomic>
int main()
{
std::atomic<double> d;
double e;
std::cout << d << " " << e << std::endl;
}
Ни лязг 3,8, ни GCC 6.2, как представляется, в состоянии произвести предупреждение для d
быть неинициализированным. См. live at coliru: Я использовал -Wall -pedantic -Wextra
, но не получил предупреждения как с -O2
, так и без него. Разумеется, обычно создается предупреждение о том, что e
не инициализируется. (Интересно, что НКУ фактически не производит какого-либо предупреждения, когда -O2
включена.)
Конечно, я не можно ожидать компилятор, чтобы предупредить меня об этих вещах; но этот случай оставил мне интересно:
- Есть ли особая причина, почему эта ситуация не обнаружена/не указана соответствующими компиляторами?
- ... или даже (я бы предположил, что это маловероятно): невозможно ли по какой-либо причине обнаружить/сообщить о пропавшей инициализации в конкретном случае
std::atomic<T>
, гдеT
не имеет конструктора по умолчанию? - или, может быть, есть еще один ключ командной строки, который я пропускаю, что заставит компилятор выдать предупреждение?
Спасибо. Я попробовал '-WeffC++', к сожалению, в этом случае не имеет значения. – mindriot