2010-07-06 16 views
8

esta pregunta no tiene problemas prácticos asociados a ella, es más una cuestión de curiosidad y ganas de saber si estoy tomando las cosas demasiado literalmente;).Defecto menor (sin importancia) en el estándar?

Así que han estado tratando de trabajar hacia la comprensión tanto de la norma C++ como sea posible. Hoy en mi profundizar en el estándar me di cuenta de esto (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. 

parece bastante cuerdo para mí. Pero luego pensé, espera un segundo ¿cuál es la definición de data()?

const charT* data() const; 

yup, devuelve un constcharT*.

Es evidente que la versión no const de operator[] no se puede implementar como un simple return data()[pos] continuación, ya que sería inicializar una referencia de tipo char& partir de una expresión de tipo const char.

creo que es obvio que la intención es que data() implementarse algo así como return data_; y operator[] implementarse como return data_[pos]; o algo funcionalmente similares, pero eso no es lo que la norma dice: -P.

Si no recuerdo mal, los ejecutores tienen cierta libertad de acción que puedan poner en práctica las cosas como les plazca, siempre y cuando cumpla con los requisitos básicos dados y tiene el mismo efecto neto.

Así que la pregunta es, ¿estoy siendo manera demasiado literal, o este es el tipo de cosa que se consideraría un defecto.

EDIT: Vale la pena señalar que el proyecto de C++ 0x ha cambiado la redacción para:

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

Así que tal vez sólo he tropezado con algo que ya se ha discutido.

+0

Iba a sugerir mirando el nuevo proyecto de norma, pero que está muy por delante de mí. Pequeñas quejas como esta no son infrecuentes. –

+3

Los estándares están escritos por personas, no por dioses :) –

+0

@Nikolai: Por supuesto, tenía curiosidad por saber si este es el tipo de cosa que se consideraría un defecto o si estaba siendo demasiado literal en mis interpretaciones. –

Respuesta

1

Supongo que usaron data() en la definición en lugar de data_ porque querían definir estrictamente en términos de la interfaz pública.

+1

seguro, pero literalmente ** ** no se compilará si la versión no constante del 'operador []' 'se implementa como datos de retorno() [pos];' –

+1

@ Evan: Por desgracia, se olvidaron de compilar el estándar antes de publicarlo. –

+0

@Mike: Detección de desbordamiento de pila: necesitaría un compilador compatible con ese estándar, que requiere un estándar, que requiere un compilador compatible con el estándar, que ... – MSalters

Cuestiones relacionadas