Como Matthew Wilson discute en Imperfect C++, esto puede ser utilizado para hacer cumplir la seguridad de tipos en C++, mediante la prevención de uso de DIMENSION_OF()
-como macros con instancias de tipos que definen el operador subíndice, como en:
#define DIMENSION_OF_UNSAFE(x) (sizeof(x)/sizeof((x)[0]))
#define DIMENSION_OF_SAFER(x) (sizeof(x)/sizeof(0[(x)]))
int ints[4];
DIMENSION_OF_UNSAFE(ints); // 4
DIMENSION_OF_SAFER(ints); // 4
std::vector v(4);
DIMENSION_OF_UNSAFE(v); // gives impl-defined value; v likely wrong
DIMENSION_OF_SAFER(v); // does not compile
Hay más en esto, para tratar con punteros, pero eso requiere un poco de inteligencia de plantilla adicional. Consulte la implementación de STLSOFT_NUM_ELEMENTS()
en las bibliotecas STLSoft, y lea sobre esto en el capítulo 14 de Imperfect C++.
editar: algunos de los comentaristas sugieren que la implementación no rechaza los punteros. Lo hace (así como también los tipos definidos por el usuario), como se ilustra en el siguiente programa. Puede verificar esto mediante las líneas 16 y 18 sin comentario (solo hice esto en Mac/GCC4, y rechaza ambas formas).
1
2 #include <stlsoft/stlsoft.h>
3
4 #include <vector>
5
6 #include <stdio.h>
7
8 int main()
9 {
10 int ar[1];
11 int* p = ar;
12 std::vector<int> v(1);
13
14 printf("ar: %lu\n", STLSOFT_NUM_ELEMENTS(ar));
15
16 // printf("p: %lu\n", STLSOFT_NUM_ELEMENTS(p));
17
18 // printf("v: %lu\n", STLSOFT_NUM_ELEMENTS(v));
19
20 return 0;
21 }
22
Duplicado: http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a. –