Этот вопрос не имеет никаких практических проблем, связанных с ним, это - больше вопрос любопытства и желания знать, беру ли я вещи слишком буквально ;).
Таким образом, я пытался работать для понимания как можно большего количества стандарта 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.
Таким образом, возможно, я только что споткнулся на что-то, что было уже обсуждено.
Да, это был дефект, и да, это было исправление.
http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#259
Я предполагаю, что они использовали data ()
в определении вместо data_
, потому что они хотели определить строго в терминах открытого интерфейса.