Por reglas realmente pedantes, sí, su código necesita una definición para ese entero estático. Pero, según las reglas prácticas, y lo que implementan todos los compiladores, porque así es como están diseñadas las reglas de C++ 03, no, no necesita una definición.
Las reglas para tales enteros constantes estáticos están destinadas a permitirle omitir la definición si el entero se usa solo en situaciones donde un valor se lee inmediatamente, y si el miembro estático se puede usar en expresiones constantes.
En su declaración de devolución, el valor del miembro se lee inmediatamente, por lo que puede omitir la definición del miembro entero constante estático si ese es el único uso de la misma. Sin embargo, la siguiente situación necesita una definición:
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
int *p = &A::B::b;
}
No se lee ningún valor aquí, pero en su lugar se toma la dirección. Por lo tanto, la intención del Estándar C++ 03 es que debe proporcionar una definición para el miembro como la siguiente en algún archivo de implementación.
const int A::B::b;
Tenga en cuenta que los reglas actuales que aparecen en el C++ 03 estándar dice que no es necesaria una definición única, donde se utiliza la variable en una expresión constante es necesaria . Sin embargo, esa regla, si se aplica estrictamente, es demasiado estricta. Solo le permitiría omitir una definición para una situación como dimensiones de matriz, pero requeriría una definición en casos como una declaración de devolución. El informe de defectos correspondiente es here.
La redacción de C++ 0x se ha actualizado para incluir la resolución del informe de defectos y permitir el código tal como está escrito.
El código _doses_ contiene una definición para 'a'. –
No, no contiene una definición. –
@Henk. Realmente no. Intente pasar la dirección de 'a' o 'b' a una función y vea qué mensaje genera el compilador. –