c ++ 26 вводит «ошибочное поведение» для ненициализированных данных и вводит атрибут [[[Неопределенный]]] для восстановления поведения Pre-C ++ 26 по мере необходимости. Я хочу получить сопоставимое поведение, но я заблокирован более ранним C ++.
Код: Выделить всё
int result;
// ... other logic ...
if (happytimes) {
result = 0;
} else {
// TODO: handle the error and return errorcode().
}
// ... other logic ...
return result;
Clang выпускает предупреждение, потому что это! К сожалению, я сталкиваюсь с Linter, который настаивает на том, чтобы обеспечить безопасность и предсказуемость Pre-C ++ 26, что я всегда инициалирую свои переменные. Поэтому я изменяю свой код: < /p>
Код: Выделить всё
int result{};
// ... other logic ...
if (happytimes) {
result = 0;
} else {
// TODO: handle the error and return errorcode().
}
// ... other logic ...
return result;
А теперь Linter, , а также Clang , молчит. Но код все еще нарушен. Спасибо Линтер! В C ++ 26 Я мог бы оставить переменную ненициализированной и извлечь выгоду из проверки времени компиляции и гарантий безопасности времени выполнения. В коде Pre-C ++ 26 я мог бы инициализировать переменную для сборов выпуска, чтобы убедиться, что она безопасна, но оставить ее неонициализированной в сборках отладки и сборки дезинтеров, чтобы убедиться, что проверки функционируют правильно. А для Линтера я мог притворяться, что инициализировал переменную, просто чтобы закрыть глупую вещь. Я попробовал шаблон: < /p>
Код: Выделить всё
template inline T Uninitialized() {
#if MUST_INIT_CASES
T value{};
#else
T value;
#endif
return value;
}
int result = Uninitialized();
< /code>
Но неудивительно, что ошибка была вызвана в шаблоне, а не в коде, который вернулся на результат шаблона. Я не мог понять, как пройти это прозрачно.#if MUST_INIT_CASES
# define UNINITIALISED {}
#else
# define UNINITIALISED
#endif
int result UNINITIALISED;
Но, может быть, есть что -то более надежное?>
Подробнее здесь:
https://stackoverflow.com/questions/797 ... sions-of-c