У меня есть код, подобный следующему:Как обойти «* ((пустота *) и б +4)» GCC может быть использован неинициализированным в этом предупреждении при использовании функции подталкивание :: опциональный
#include <boost/optional.hpp>
::boost::optional<int> getitem();
int go(int nr)
{
boost::optional<int> a = getitem();
boost::optional<int> b;
if (nr > 0)
b = nr;
if (a != b)
return 1;
return 0;
}
при компиляции с GCC 4.7.2 с Boost, 1.53, используя следующую команду:
г ++ -c -O2 -Wall -DNDEBUG
следующее предупреждение выдается:
13: 3: предупреждение: '((недействительными) & б +4)' может быть использовано неинициализированным в этой функции [-Wmaybe-неинициализированным]
Очевидно, что корень проблемы лежит GCC. См. GCC Bugzilla Кто-нибудь знает обходной путь?
Если конструктор 'b' не инициализирует все, что находится внутри него , то, во всяком случае, 'b' в выражении' a! = b' может быть неинициализирован. Что делать, если вы фактически инициализируете 'b'? Вы все еще получаете предупреждение? – Shahbaz
@Shahbaz: Конструктор 'b' создает необязательный параметр, где значение не существует. Это допустимое поведение для необязательного. 'a! = b' Должен быть прав, если оба варианта неинициализированы. Так что это должен быть правильный код. Инициализация 'b' значением отменяет предупреждение, но это не вариант, поскольку он изменяет поведение кода. Возвращение getitem() может быть неинициализированным необязательным. –