Разве плохо зависеть от индекса 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 объясняет, какие обстоятельства позволяют вам сделать ваше предположение. Я хотел бы добавить, что
это плохое программирование.
Зачем? По нескольким причинам:
- Вы должны быть языковым адвокатом, чтобы быть уверенным, что это не ошибка. Я бы не знал ответа, если бы не эта страница, и, честно говоря - я не думаю, что вам действительно стоит беспокоиться об этом.
- Люди, не понимающие, что строка представляет собой последовательность символов с нулевым символом в конце, не будут знать, что вы пытаетесь сделать, пока не прочитают стандарт или не спросят своих друзей.
- Плохо нарушает принцип наименьшего удивления.
- Идет вразрез с принципом "писать то, что вы имеете в виду", то есть иметь код, выражающий понятия проблемной области.
- Сортировка в своем использовании магического числа (это спорно 0 на самом деле, является ли магическое число в данном случае).
Должен ли я продолжить?... Я почти уверен, что у вас есть альтернативный руководитель почти во всех отношениях. Я даже рискну догадаться, что вы сделали что-то еще "плохое", чтобы манипулировать собой, чтобы захотеть сделать это.
Всегда помните: другие люди, которые не будут консультироваться с вами, рано или поздно должны будут поддерживать этот код. Думайте о них, а не только о себе, которые могут понять это. Кроме того, через десять лет, кто скажет, что вы вспомните свой собственный трюк? Вы можете быть таким запутанным сопровождающим...