online ejemplos descargar definicion caracteristicas c++

ejemplos - c++ online



¿Por qué hay un nombre de clase inyectado? (1)

El nombre de clase inyectado significa que X se declara como miembro de X , de modo que la búsqueda de nombre dentro de X siempre encuentra la clase actual, no otra X que podría declararse en el mismo ámbito adjunto, por ejemplo

void X() { } class X { public: static X create() { return X(); } };

¿La función create() crea un objeto X temporal o llama a la función X ? En el ámbito del espacio de nombres llamaría a la función, por lo que el propósito del nombre de clase inyectado es garantizar que dentro del cuerpo de X el nombre siempre encuentre la clase en sí misma (porque la búsqueda del nombre comienza en el propio alcance de la clase antes de buscar en el alcance adjunto).

También es útil en las plantillas de clase, donde el nombre de clase inyectado se puede usar sin una lista de argumentos de plantilla, por ejemplo, utilizando simplemente Foo lugar de la plantilla completa id Foo<blah, blah, blah> , por lo que es fácil consultar la instanciación actual . Ver DR 176 para un cambio entre C ++ 98 y C ++ 03 que aclaró eso.

La idea del nombre de clase inyectado estaba presente en C ++ 98, pero la terminología era nueva para C ++ 03.

C ++ 98 dice:

Un nombre de clase se inserta en el ámbito en el que se declara inmediatamente después de que se vea el nombre de clase . El nombre de clase también se inserta en el alcance de la clase en sí.

La segunda oración fue modificada por DR 147, por lo que C ++ 03 dice en [clase] / 2:

Un nombre de clase se inserta en el ámbito en el que se declara inmediatamente después de que se vea el nombre de clase . El nombre de clase también se inserta en el alcance de la clase en sí; esto se conoce como el nombre de clase inyectado .

Incluso antes de C ++ 98, el ARM tiene una redacción más o menos equivalente, lo que significa que el nombre de la clase siempre se puede usar en el cuerpo de la clase para referirse a la clase en sí misma:

El nombre de una clase se puede usar como nombre de clase incluso dentro de la lista de miembros del propio especificador de clase.

  • Por ejemplo,

    class link { link* next; };

Recientemente, vi una característica extraña de C ++: el nombre de clase inyectado .

class X { }; X x1; class X::X x2; // class X::X is equal to X class X::X::X x3; // ...and so on...

Pero no puedo entender por qué esta función es necesaria. ¿Hay alguna práctica que requiera esta característica?

Y escuché que esta característica no existía en el viejo C ++. Entonces, cuando fue presentado? C ++ 03? C ++ 11?