Dado que las plantillas se definen dentro de los encabezados y el compilador puede determinar si incluir una función en línea es ventajoso, ¿tiene algún sentido? Escuché que los compiladores modernos saben mejor cuándo insertar una función y están ignorando la inline
pista.
editar: Me gustaría aceptar ambas respuestas, pero esto no es posible. Para cerrar el tema, acepto la respuesta de phresnel , porque recibió la mayoría de los votos y formalmente tiene razón, pero como mencioné en los comentarios, considero que las respuestas de Puppy y del Componente 10 también son correctas, desde un punto de vista diferente .
El problema está en la semántica de C ++, que no es estricta en el caso de inline
palabras clave e inlining. phresnel dice "escribe en línea si lo dices en serio", pero lo que en realidad significa inline
no está claro ya que evolucionó de su significado original a una directiva que "detiene a los compiladores quejándose de violaciones de ODR" como dice Puppy .
inline
solo porque la plantilla que se especializó está marcada coninline
. Entonces,inline
en la plantilla es completamente irrelevante. Si esa función debería serinline
o no, no tiene nada que ver con que se genere a través de una especialización de plantilla (y hay mejores respuestas que esta que se refieren a cuándo usarinline
). La respuesta de @Puppy a continuación es correcta, esta no lo es. Agregarinline
una plantilla es irrelevante yclang-tidy
, de hecho, la eliminará.inline
no es irrelevante, el ejemplo debería cubrir el caso de especialización explícitatemplate<> void f<>(int) {}
sin lainline
palabra clave. Pero incluso entonces cambiar elinline
especificador en la plantilla no hace ninguna diferencia, porque si marca la plantillainline
o no es irrelevante.Es irrelevante. Todas las plantillas ya lo están
inline
, sin mencionar que a partir de 2012, el único uso de lainline
palabra clave es evitar que los compiladores se quejen de violaciones de ODR. Tiene toda la razón: su compilador de generación actual sabrá qué incluir en línea por sí mismo y probablemente pueda hacerlo incluso entre unidades de traducción.fuente
inline
las funciones marcadas (es decir, se pueden pasar múltiples definiciones equivalentes al enlazador, que seleccionará una). Esa, no la alineación, es la función real de lainline
palabra clave.inline
. Tal vez eche un vistazo a mi respuesta a continuación (o arriba, según la clasificación elegida). Para las plantillas no especializadas, por supuesto que tiene razón, pero formalmente no es lo mismo.inline
lo que se supone que está en línea. Por lo general, no hace ninguna diferencia, pero en estándar, no son iguales y no están todos en línea. Acepto su postura al respecto diciendo "Es irrelevante", pero según el estándar, no todas las plantillas están en línea, solo para usted como usuario de C ++; aparecen como si lo fueran.Como sugirió,
inline
es una pista para el compilador y nada más. Puede optar por ignorarlo o, de hecho, por funciones en línea no marcadas en línea.Utilizando
inline
con plantillas solía ser una forma (pobre) de solucionar el problema de que cada unidad de compilación crearía un objeto separado para la misma clase de plantilla que luego causaría problemas de duplicación en el momento del enlace. Al usarinline
(creo), la alteración de nombres funciona de manera diferente, lo que evita el conflicto de nombres en el momento del enlace, pero a expensas de un código enormemente inflado.Marshall Cline lo explica aquí mejor que yo.
fuente
§14.5.5.1 p7 & p8
). Mi mal, eliminé el comentario equivocado.