Considere el siguiente código:¿Por qué constexpr funciona con plantillas?
template<typename T>
constexpr inline T fma(T a, T b, T c)
{
return a * b + c;
}
Esto compila bien. Pero ¿por qué? En teoría, las funciones constexpr solo pueden llamar a otras funciones constexpr. Sin embargo, no hay garantía de que los operadores sean funciones constestables. Por ejemplo, digamos que tengo algún tipo con la siguiente interfaz:
Los operadores + y * no son constexpr. Si escribo el siguiente código:
fma(someType(), someType(), someType());
Debe dejar de compilar porque una función constexpr está llamando a funciones no constexpr. Pero compila bien. ¿Por qué es esto?
Estoy usando el compilador G ++ de MinGW con la opción -std = C++ 0x.
Para un ejemplo donde es descaradamente obvio que no puede optimizar todo, compila con GCC 4.7.1 cuando se ingresan los tres argumentos y se imprime el resultado: http://ideone.com/aBRPU – chris
intente esto: 'constexpr someType dummy = fma (someType(), someType(), someType());';) – mfontanini
Ooh, acabo de encontrar en el estándar que las funciones 'constexpr' están implícitamente en línea, si eso te ahorra espacio. – chris