¿Constexpr implica en línea?

Considere la siguiente función en línea:

// Inline specifier version #include #include inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } 

y la versión equivalente constexpr:

 // Constexpr specifier version #include #include constexpr int f(const int x); constexpr int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } 

Mi pregunta es: ¿el especificador constexpr implica el especificador en inline en el sentido de que si se pasa un argumento no constante a una función constexpr , el comstackdor intentará constexpr la función como si el especificador en inline se pusiera en su statement?

¿El estándar C ++ 11 garantiza eso?

Sí ([dcl.constexpr], §7.1.5 / 2 en el estándar C ++ 11): “las funciones constexpr y constexpr constructors están implícitamente en línea (7.1.2)”.

Tenga en cuenta, sin embargo, que el especificador en inline realmente tiene muy poco (si es que tiene alguno) efecto sobre si un comstackdor puede expandir una función en línea o no. Sin embargo, sí afecta la regla de una definición, y desde esa perspectiva, el comstackdor debe seguir las mismas reglas para una función constexpr que una función en inline .

También debo agregar que, independientemente de constexpr implique en inline , las reglas para constexpr funciones constexpr requieren que sean lo suficientemente simples como para ser a menudo buenos candidatos para la expansión en línea (la principal excepción son las recursivas).