Незначительный (неважный) дефект в стандарте?

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

Таким образом, я пытался работать для понимания как можно большего количества стандарта 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;

да, это возвращает a const charT*.

Очевидно версия неконстанты operator[] не может быть реализован как простое return data()[pos] затем, так как это инициализировало бы ссылку типа char& от выражения типа const char.

Я думаю, что очевидно, что намерение - это 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.

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

8
задан kennytm 6 November 2010 в 21:25
поделиться

2 ответа

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

http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#259

6
ответ дан 5 December 2019 в 21:16
поделиться

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

1
ответ дан 5 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: