Незначительный (неважный) дефект в стандарте? - PullRequest
8 голосов
/ 06 июля 2010

Этот вопрос не имеет практических проблем, связанных с ним, это скорее вопрос любопытства и желания узнать, воспринимаю ли я вещи слишком буквально;).

Итак, я пытался понять как можно больше стандарта 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.

Так что, возможно, я только что наткнулся на то, что уже обсуждалось.

Ответы [ 2 ]

6 голосов
/ 07 июля 2010

Да, это был дефект, и да, это было исправление.

http://www.open -std.org / ОТК1 / SC22 / WG21 / документы / ПРГ-defects.html # 259

1 голос
/ 06 июля 2010

Я предполагаю, что они использовали data() в определении вместо data_, потому что они хотели определить в терминах общедоступного интерфейса.

...