2011-12-14 18 views
18
  • ¿De dónde viene size_t cuando no tengo nada incluido?
  • ¿Es razonable suponer siempre size_t == std::size_t?
  • ¿Cuándo debo usar el size_type en contenedores std (string::size_type, vector<T>::size_type, etc.)?
+0

Suena como un compilador específico –

+0

¿Podría explicar lo que observó para su primer punto? Para tu compilador, ¿'size_t a;' funciona como una declaración incluso cuando no has '#incluido'd nada? Dado que parece ser una pregunta sobre una implementación, ¿podría decirnos qué implementación está utilizando? –

+0

@DavidThornley Eso es exactamente lo que veo, estoy usando VS2010 – David

Respuesta

10

¿De dónde viene size_t cuando no tengo nada incluido en un proyecto vacío?

Si no tiene nada incluido, no puede usar size_t. Se define en <stddef.h> (y quizás también en <cstddef>, si su versión de ese encabezado incluye las definiciones en el espacio de nombres global así como std).

¿Es razonable suponer siempre size_t == std :: size_t?

Sí. Todos los tipos y funciones definidas por la biblioteca de C están incluidas en el std espacio de nombres, siempre y cuando incluya la cabecera apropiada C++ (por ejemplo, en lugar de <cstddef><stddef.h>)

Cuando debo usar std :: _ :: ¿tipo de letra?

¿Te refieres a los tipos size_type definidos en algunas clases y plantillas estándar como vector? Podría usarlos cuando use esas clases si lo desea. En la mayoría de los casos, sabrá que es lo mismo que size_t, por lo que es mejor que lo use y guarde un poco de tipeo. Si está escribiendo código genérico, donde no sabe cuál es la clase, entonces es mejor usar size_type en caso de que no sea compatible con size_t.

Por ejemplo, es posible que desee escribir un contenedor diseñado para contener más elementos de los que puede representar size_t. Puede usar algún tipo de tipo de número grande para representar el tamaño del contenedor, que no es convertible a size_t.En ese caso, el código como size_t s = c.size() no compilaría; en su lugar, necesitaría usar Container::size_type.

+0

En su primer punto, puedo usar size_t cuando no he incluido nada. Como referencia, estoy usando VS2010. – David

+0

@Dave: Supuestamente se trata de una extensión de Microsoft para el lenguaje, hay muchos de ellos. Intenta compilar con extensiones de idioma deshabilitadas. –

+0

Tiene razón sobre lo que quise decir con 'std :: ____ :: size_type' pero ¿puede explicar en detalle cuándo podría ser 'incompatible' con size_t, y la diferencia entre lo que std :: size_t y :: size_type representan? – David

1

¿De dónde viene size_t cuando no tengo nada incluido en un proyecto vacío?

size_t es un entero base sin signo de memsize-type definido en la biblioteca estándar de C/C++. Se define en "stddef.h" para C y en <cstddef> para C++.

Tipos definidos por el archivo de cabecera "stddef.h" se encuentran en el espacio de nombres global, mientras que <cstddef> cabecera coloca el tipo size_t en el espacio de nombres std.

"stddef.h" de C se incluye en C++ para la compatibilidad, y por lo tanto el tipo se puede encontrar tanto en el espacio de nombres global (::size_t) y el espacio de nombres std (std::size_t).

0

size_t se define en <cstddef> y está en std namespace.

+3

Sería bueno (al menos para mí aprender) si el infractor explica el motivo. – Sanish

Cuestiones relacionadas