Неплохо ли зависеть от индекса 0 пустого std::string?

std::string my_string = "";
char test = my_string[0];

Я заметил, что это не сбой, и каждый раз, когда я его тестировал, тест равен 0.

Могу ли я зависеть от него всегда 0? или это произвольно?

Это плохое программирование?

Изменить: Из некоторых комментариев я понимаю, что есть некоторые недоразумения относительно полезности этого.

Цель этого - НЕ проверять, является ли строка пустой. Не нужно проверять, является ли строка пустой.

Ситуация такова, что есть строка, которая может быть или не быть пустым. Меня интересует только первый символ этой строки (если она не пустая).

Мне кажется, было бы менее эффективно проверять, является ли строка пустой, а затем, если она не пуста, посмотрите на первый символ.

if (! my_string.empty())
    test = my_string[0];
else
    test = 0;

Вместо этого я могу просто взглянуть на первого символа без необходимости проверять, пуста ли строка.

test = my_string[0];

Ответ 1

С++ 14

Нет; вы можете зависеть от него.

В 21.4.5.2 (или [string.access]) мы можем найти:

Возвращает: *(begin() + pos), если pos < size(). В противном случае возвращается ссылка на объект типа charT со значением charT(), где изменение объекта приводит к поведению undefined.

Другими словами, если pos == size() (что верно, когда оба равны 0), оператор вернет ссылку на строковый символ по умолчанию , который вам запрещено изменять.

Он не является специальным для пустых (или 0-разрядных) строк и работает одинаково для каждой длины.


С++ 03

И, конечно же, С++ 98.

Это зависит.

Здесь 21.3.4.1 из официального ISO/IEC 14882:

Возвращает: Если pos < size(), возвращает data()[pos]. В противном случае, если pos == size(), версия const возвращает charT(). В противном случае поведение undefined.

Ответ 2

@Bartek Banachewicz answer объясняет, какие обстоятельства позволяют вам сделать свое предположение. Я хотел бы добавить, что

это плохое программирование.

Почему? По нескольким причинам:

  • Вы должны быть адвокатом языка, чтобы быть уверенным, что это не ошибка. Я бы не знал ответа, если бы не эту страницу, и, честно говоря, я не думаю, что вам действительно нужно было это знать.
  • Люди, не имеющие интуиции строки, представляющей собой последовательность символов с нулевым завершением, не будут знать, что вы пытаетесь сделать, пока не прочитаете стандарт или не попросите своих друзей.
  • Прерывает принцип наименьшего удивления в плохом смысле.
  • Противоречит принципу "писать то, что вы имеете в виду", то есть иметь код, выражающий концепцию проблемной области.
  • Сортировка магического номера (в этом случае можно утверждать, что 0 действительно составляет магическое число).

Продолжить?... Я на 99% уверен, что у вас есть альтернативный начальник почти во всех отношениях. Я даже на 66% убежден, что вы сделали что-то еще, что "плохо", чтобы манипулировать собой, желая это сделать.

Всегда помните: Другие люди, которые не будут вам советоваться, рано или поздно должны будут поддерживать этот код. Думайте о них, а не о себе, кто может это понять. Кроме того, через десять лет, кто скажет, что вы запомните свой трюк? Возможно, это был запутанный сопровождающий...