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

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

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

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

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

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

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

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

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

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

Вместо этого я могу просто посмотреть на первый символ, не проверяя, является ли строка пустой.

test = my_string[0];

2 ответа

Решение

C++14

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

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

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

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

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


C++ 03

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

Это зависит.

Вот 21.3.4.1 из официального ISO/IEC 14882:

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

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

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

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

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

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

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

Другие вопросы по тегам