2010-07-06 13 views
8

To pytanie nie ma żadnych praktycznych problemów z nim związanych, to raczej kwestia ciekawości i chęć dowiedzenia się, czy mówię zbyt dosłownie;).Drobna (nieważna) wada w standardzie?

Tak więc staram się pracować nad zrozumieniem jak największej liczby standardów C++. Dziś w moim zagłębiając się w standardzie Zauważyłem to (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. 

wydaje się całkiem rozsądny do mnie. Ale potem pomyślałem sobie, poczekaj sekundę, jaka jest definicja data()?

const charT* data() const; 

yup, to zwraca constcharT*.

Wyraźnie const wersja operator[] nie mogą być realizowane w prosty return data()[pos] następnie od które byłyby inicjalizacji odniesienie typu char& z ekspresją typu const char.

myślę, że jest oczywiste, że intencją że data() być realizowane coś return data_; i operator[] być realizowane jako return data_[pos]; lub coś podobnego funkcjonalnie, ale to nie to, co standardowe mówi :-P.

Jeśli dobrze pamiętam, realizatorzy mają pewną swobodę w tym, że mogą realizować swoje zadania tak długo, jak spełniają podstawowe wymagania i mają taki sam efekt netto.

Pytanie brzmi: czy jestem zbyt dosłowny, czy jest to rodzaj rzeczy, która mogłaby zostać uznana za wadę.

EDIT: Warto zauważyć, że C++ 0x projekt zmienił sformułowanie:

Returns: If pos < size(), returns *(begin() + pos). 
     Otherwise, if pos == size(), the const version returns charT(). 
     Otherwise, the behavior is undefined. 

Więc może właśnie natknął się na coś, co już zostało omówione.

+0

miałem zamiar zaproponować spojrzenie na nowego projektu normy, ale jesteś droga przede mną. Takie małe niedociągnięcia nie są rzadkością. –

+3

Standardy są pisane przez ludzi, a nie przez bogów :) –

+0

@Nikolai: Oczywiście, byłem po prostu ciekawy, czy to jest typ rzeczy, która byłaby uważana za wadę lub gdybym był zbyt dosłowny w moich interpretacjach. –

Odpowiedz

1

Zakładam, że użyli data() w definicji zamiast data_, ponieważ chcieli zdefiniować w kategoriach interfejsu publicznego.

+1

z pewnością, ale to dosłownie ** nie skompiluje ** jeśli niestanowiąca wersja 'operator []' jest zaimplementowana jako 'return data() [pos];' –

+1

@Evan: Niestety, zapomnieli skompilować standard przed opublikowaniem. –

+0

@Mike: Wykryto stosu przepełnień: do tego celu potrzebny jest kompilator zgodny z normami, który wymaga standardu, który wymaga kompilatora zgodnego ... – MSalters

Powiązane problemy