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 inlinepista.
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 inlinepalabras clave e inlining. phresnel dice "escribe en línea si lo dices en serio", pero lo que en realidad significa inlineno 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 .

inlinesolo porque la plantilla que se especializó está marcada coninline. Entonces,inlineen la plantilla es completamente irrelevante. Si esa función debería serinlineo 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. Agregarinlineuna plantilla es irrelevante yclang-tidy, de hecho, la eliminará.inlineno es irrelevante, el ejemplo debería cubrir el caso de especialización explícitatemplate<> void f<>(int) {}sin lainlinepalabra clave. Pero incluso entonces cambiar elinlineespecificador en la plantilla no hace ninguna diferencia, porque si marca la plantillainlineo no es irrelevante.Es irrelevante. Todas las plantillas ya lo están
inline, sin mencionar que a partir de 2012, el único uso de lainlinepalabra 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
inlinelas 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 lainlinepalabra 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.inlinelo 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ó,
inlinees 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
inlinecon 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.