2010-07-06 6 views
8

Cette question n'a pas de problèmes pratiques associés, c'est plus une question de curiosité et de vouloir savoir si je prends les choses trop littéralement;).Défaut mineur (non important) dans la norme?

J'ai donc essayé de travailler pour comprendre autant que possible la norme C++. Aujourd'hui, dans mon Fouiller dans la norme Je l'ai remarqué (ISO/CEI 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. 

assez sain d'esprit pour Semble moi. Mais alors je me suis dit, attendez une seconde quelle est la définition de data()?

const charT* data() const; 

yup, il retourne une constcharT*.

Il est clair que la version non-const de operator[] ne peut pas être mis en œuvre comme un return data()[pos] alors simple puisque ce serait l'initialisation d'une référence de type char& d'une expression de type const char.

Je pense qu'il est évident que l'intention est que data() être mis en œuvre quelque chose comme return data_; et operator[] être mis en œuvre comme return data_[pos]; ou quelque chose fonctionnellement similaire, mais ce n'est pas ce que dit la norme :-P. Si je me souviens bien, les réalisateurs ont une certaine marge de manœuvre dans la mesure où ils peuvent mettre en œuvre les choses comme ils le souhaitent tant qu'il répond aux exigences de base et a le même effet net.

Donc la question est, suis-je façon trop littérale, ou est-ce le type de chose qui serait considéré comme un défaut.

EDIT: Il convient de noter que le C++ 0x projet a modifié le libellé à:

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

Alors peut-être que je viens trébuché sur quelque chose qui a déjà été discuté.

+0

J'allais suggérer regarder le nouveau projet de norme, mais vous êtes en avance sur moi. Les petits reproches comme celui-ci ne sont pas rares. –

+3

Les normes sont écrites par des personnes, pas des dieux :) –

+0

@Nikolai: Bien sûr, j'étais simplement curieux de savoir si c'est le genre de chose qui serait considéré comme un défaut ou si j'étais un peu trop littéral dans mes interprétations. –

Répondre

1

Je suppose qu'ils ont utilisé data() dans la définition au lieu de data_ car ils voulaient définir strictement en termes de l'interface publique.

+1

sûr, mais littéralement ** ne compilera pas ** si la version non-const de 'operator []' est implémentée en tant que 'return data() [pos];' –

+1

@Evan: Malheureusement, ils ont oublié de compiler le standard avant de le publier. –

+0

@Mike: Stack Overflow détecté: vous aurez besoin d'un compilateur compatible standard pour cela, ce qui nécessite un standard, ce qui nécessite un compilateur standard, qui .... – MSalters

Questions connexes