Установить все байты int в (без знака) 0, гарантированно равный нулю?

Это не вопрос рекомендуемая практика (ни неопределенное поведение), но о чемc ++ -стандарт фактически гарантирует при преобразовании всех байтов целочисленного типа в значение(unsigned char)0.

Вопросы

В приведенном ниже фрагменте это выражение, используемое Если-заявление гарантированно будет оценено какправд в C ++ 11?

std::memset (
  reinterpret_cast<char*> (&a), // int a;
  (unsigned char)0,
  sizeof (int)
);

if (a == 0) {
  ...
}

Читая цитаты из стандартов C99 и C ++ 11 (далее в этом посте), мы находим, что C99 явно Гарантии что целочисленный тип со всеми битами, установленными в0 будет представлять значение0 в этом типе.

Я не могу найти эту гарантию в стандарте C ++ 11.

Разве нет такой гарантии? Результат предыдущего фрагмента действительно зависит от реализации? В C99 (ISO / IEC 9899: 1999) 5.2.1.2 / 1 Многобайтовые символы

Байт со всеми нулевыми битами должен интерпретироваться как нулевой символ независимо от состояния сдвига. Такой байт не должен встречаться как часть любого другого многобайтового символа.

6.2.6.2 / 1 Целочисленные типы

Значения любых битов заполнения не определены. 45) Допустимое (не перехватываемое) объектное представление целого типа со знаком, где бит знака равен нулю, является допустимым объектным представлением соответствующего типа без знака и должно представлять то же значение.

Для любого целочисленного типа представление объекта, в котором все биты равны нулю, должно быть представлением значения ноль в этом типе.

В C ++ 11 (ИСО / МЭК 14882: 2011) 2.3 / 3 Наборы символов [lex.charset]

Базовый набор символов выполнения и базовый набор широких символов выполнения должны содержать все элементы базового набора исходных символов, а также управляющие символы, представляющие предупреждение, возврат и возврат каретки, а также нулевой символ (соответственно, нулевой широкий символ), представление которого имеет все нулевые биты.

Ответы на вопрос(4)

Ваш ответ на вопрос