§5.19 / 2 (на второй странице; его действительно следует разбить на множество абзацев) запрещает константные выражения, содержащие
- преобразование lvalue-в-значение (4.1), если оно не применяетсяв
- значение целочисленного типа или типа перечисления, которое относится к энергонезависимому объекту const с предшествующей инициализацией, инициализированному с помощью константного выражения, или
- aglvalue литерального типа, который относится к энергонезависимому объекту, определенному с помощью constexpr, или который относится к подобъекту такого объекта
str[1000]
переводится в * ( str + 1000 )
, который не относится к подобъекту str
, в отличие от доступа к массиву в границах.Так что это правило, которое можно диагностировать, и компилятор должен жаловаться.
РЕДАКТИРОВАТЬ: Кажется, существует некоторая путаница в том, как возникает этот диагноз.Компилятор проверяет выражение против §5.19, когда оно должно быть постоянным.Если выражение не удовлетворяет требованиям, компилятор должен пожаловаться.По сути, требуется проверять константные выражения в отношении всего, что в противном случае могло бы вызвать неопределенное поведение. * Это может включать или не включать в себя попытку оценить выражение.
* В C ++ 11 "результат, которыйне определено математически. "В C ++ 14 «операция, которая будет иметь неопределенное поведение», которая по определению (§1.3.24) игнорирует поведение, которое реализация может определить как запасной вариант.