Этот вопрос не имеет практических проблем, связанных с ним, это скорее вопрос любопытства и желания узнать, воспринимаю ли я вещи слишком буквально;).
Итак, я пытался понять как можно больше стандарта c ++.Сегодня, углубляясь в стандарт, я заметил это (ISO / IEC 14882: 2003 21.3.4):
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
Returns: If pos < size(), returns data()[pos].
Otherwise, if pos == size(), the const version returns charT().
Otherwise, the behavior is undefined.
Мне это кажется довольно вменяемым.Но потом я подумал про себя, подождите секунду, каково определение data()
?.
const charT* data() const;
да, это возвращает const
charT*
.
Очевидно, что неконстантная версия operator[]
не может быть реализована как простая return data()[pos]
тогда, так как это будет инициализировать ссылку типа char&
из выражения типа const char
.
Iдумаю, что очевидно, что намерение состоит в том, чтобы data()
было реализовано как-то вроде return data_;
и operator[]
было бы реализовано как return data_[pos];
или как-то функционально похожее, но это не то, что говорится в стандартеP.
Если я правильно помню, у разработчиков есть некоторая свобода в том, что они могут реализовывать вещи так, как им заблагорассудится, при условии, что это соответствует базовым требованиям и имеет тот же чистый эффект.
Таким образом, вопрос в том, являюсь ли я образом слишком буквальным, или это тот тип вещей, который будет считаться дефектом.
РЕДАКТИРОВАТЬ: Стоит отметить, что черновик c ++ 0x изменил формулировку:
Returns: If pos < size(), returns *(begin() + pos).
Otherwise, if pos == size(), the const version returns charT().
Otherwise, the behavior is undefined.
Так что, возможно, я только что наткнулся на то, что уже обсуждалось.