Является ли сдвиг влево целого числа со знаком неопределенным поведением в C++03?

Согласно C++03, 5.8/2, сдвиг влево определяется следующим образом:

Значением E1

Что меня здесь беспокоит, так это то, что неподписанные типы явно упоминаются, тогда как подписанные типы полностью игнорируются. Сравните это с 5.8/3, который определяет сдвиг вправо:

Значение E1 >> E2 представляет собой сдвинутые вправо битовые позиции E2 E1. Если E1 имеет беззнаковый тип или если E1 имеет знаковый тип и неотрицательное значение, значение результата равно целой части частного E1, деленной на число 2, возведенное в степень E2. Если E1 имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией.

В 5.8/3 явно упоминаются как подписанные, так и беззнаковые значения, даже подписанные, содержащие неотрицательные и подписанные, содержащие отрицательные значения, упоминаются отдельно.

Насколько я знаю, когда что-то явно не определено в стандарте C++, поведение не определено. Я также видел этот вопрос, но он фокусируется на различиях между C и C++ и, кажется, не имеет ответа, с которым бы все согласились.

Определен ли сдвиг влево целого числа со знаком в C++03?

16
задан Community 23 May 2017 в 11:54
поделиться