and - constexpr in c++
¿Constexpr implica en línea? (1)
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 compilador 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 compilador 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).
Considere la siguiente función en línea:
// Inline specifier version
#include<iostream>
#include<cstdlib>
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<iostream>
#include<cstdlib>
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 compilador intentará constexpr
la función como si el especificador en inline
se pusiera en su declaración?
¿El estándar C ++ 11 garantiza eso?