Что касается стандарта C ++, то operator[]
не гарантирует, что не проверяет, просто (в отличие от at()
) проверка не гарантируется.
Вы ожидаете, что в реализации без проверки &scoped_array[scoped_array.size()]
приведет к допустимому указателю в пределах или в один конец массива, выделенного вектором. Это явно не гарантировано, но для данной реализации вы можете проверить, посмотрев на ее источник. Для пустого вектора может вообще не быть выделения (как оптимизация), и я не вижу ничего в части vector
стандарта, которая определяет результат scoped_array[0]
, кроме таблицы 68.
Исходя из таблицы 68, вы можете сказать, что результатом вашего выражения является &*(a.begin() + 0)
, что незаконно разыменовывает внешний итератор. Если векторный итератор вашей реализации является просто указателем, то вам, вероятно, это сойдет с рук - если нет, то, возможно, нет, и, очевидно, ваш - нет.
Я забыл результаты аргумента относительно того, является ли &*
на указателе, который не должен быть разыменован, неактивным или нет. IIRC это не ясно из стандарта (некоторая двусмысленность где-то), что вызвало запросы на исправление стандарта, чтобы сделать его явно легальным. Это говорит о том, что он действительно работает на всех или на большинстве известных реализаций.
Лично я бы на это не полагался и не отключил бы проверку. Я бы переписал твой код:
char* pointer = (scoped_array.size() > 0) ? &scoped_array[0] : 0;
Или в этом случае просто:
char* pointer = (n > 0) ? &scoped_array[0] : 0;
Мне кажется неправильным использовать индекс n вектора, не зная, что его размер равен по крайней мере n + 1, независимо от того, действительно ли он работает в вашей реализации после того, как вы отключили проверку.