¿Constexpr implica en línea?


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 de 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: ¿implica el especificador constexpr el especificador inline en el sentido de que si se pasa un argumento no constante a una función constexpr, el compilador intentará inline la función como si el especificador inline se pusiera en su declaración ?

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

Author: Vincent, 2013-01-18

1 answers

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

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

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

 93
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 09:12:00