2011-03-22 10 views
31

accidentalmente me encontré con que el compilador Clang permite:¿Cuál es la clase en línea de C++?

inline class AAA 
{ 
}; 

en C++. ¿Qué es esto?


PS. Informé esto a la lista de correo de Clang [email protected], y ahora estoy esperando la respuesta. Actualizaré esta pregunta por información.

+0

función en línea tiene sentido .... pero la clase en línea ?? – mpen

+8

"¿Qué es esto?" - Algo que no existe en C++ estándar. El especificador 'inline' es para funciones, no para clases. Es posible que haya tropezado con un error en el compilador de Clang C++. –

+1

Agregué la etiqueta 'clang', no pude encontrar nada en el rastreador de errores, podría valer la pena abrir uno (siempre puede enviar un correo a cfe-dev [at] cs.uiuc.edu de antemano si no está seguro). Si esto está en la línea 2.9, probablemente querrán arreglarlo pronto. –

Respuesta

12

sonido metálico no debe permitir esto, inline sólo se puede utilizar en la declaración de funciones, desde la norma ISO/IEC 14882: 2003 7.1.2 [dcl.fct.spec]/1:

Función -specifiers solo se pueden usar en declaraciones de funciones.

inline es uno de los tres función especificadores, virtual y explicit siendo los otros.

Como señala @MatthieuM, en la próxima versión de C++ (C++ 0x), la palabra clave inline también será permitido en las definiciones de espacio de nombres (con diferentes semántica a inline como un función-especificador).

+1

En el contexto de C++ 0x, también se puede usar con espacios de nombres. –

+0

@ Matthieu: ¿Podrías ampliar eso? – Xeo

+3

@Xeo: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm –

33

Está permitido en caso de que desee declarar una función que devuelve un objeto de esa clase directamente después de la clase declaración, por ejemplo:

#include <iostream> 

inline class AAA 
{ 
public: 
    AAA() 
    { 
     // Nothing 
    } 

    AAA(const AAA& _Param) 
    { 
     std::cout << "Calling Copy Constructor of AAA\n"; 
    } 
}A() 
{ 
    AAA a; 
    return a; 
}; 

int main() 
{ 
    A(); 
    return 0; 
} 

También se debe notar los errores del compilador (o advertencias) que aparecen en otros casos ilegales, como declarar una variable en lugar de A(), también observe que el compilador indica que ignora la palabra clave inline si no declaró ninguna función.

Espero que sea útil.

Editar: Para el comentario de Eonil

Si usted está hablando acerca de su código de seguridad en la pregunta, entonces es el mismo caso que veo, el compilador le dará una advertencia: 'inline ' : ignored on left of 'AAA' when no variable is declared

sin embargo, si se utiliza el código en mi respuesta, pero sustituya A() con una variable, B por ejemplo, se generará un error de compilación: 'B' : 'inline' not permitted on data declarations

Así nos encontramos con que el compilador no hizo ningún error ingenio h aceptando tales declaraciones, ¿qué hay de tratar de escribir inline double; por sí mismo?Se generará una advertencia: 'inline ' : ignored on left of 'double' when no variable is declared

Ahora cómo sobre esta declaración:

double inline d() 
{ 
} 

se da ninguna advertencia o errores, que es exactamente lo mismo que:

inline double d() 
{ 
} 

desde la precedencia de inline no es importante en absoluto.

El primer código (en su totalidad la respuesta) es similar a la escritura:

class AAA 
{ 
    // Code 
}; 

inline class AAA A() 
{ 
    // Code 
} 

que es legal.

Y, de otra manera, se puede escribir como:

class AAA 
{ 
    // Code 
}; 

class AAA inline A() 
{ 
    // Code 
} 

Se podría ser aliviado si ve el primer código (en su totalidad la respuesta) se escribe así:

#include <iostream> 

class AAA 
{ 
    // Code 
} inline A() 
{ 
    // Code 
}; 

Pero son lo mismo, ya que no hay importancia para la precedencia de inline.

Espero que sea claro y convincente.

+3

¡¡Mis ojos !! +1 aunque es un buen y críptico ejemplo cuando esto funciona. :) – Xeo

+0

@Xeo: Peace, brother :) –

+2

¿Podría elaborar WTF, está sucediendo aquí? ¿Por qué alguna vez declararía una función como esa, y es esa función un método de la clase? – polemon

Cuestiones relacionadas