Рассмотрим следующий код:
template<typename T>
constexpr inline T fma(T a, T b, T c)
{
return a * b + c;
}
Это прекрасно компилируется. Но почему это? Теоретически функции constexpr могут вызывать только другие функции constexpr. Однако нет гарантии, что операторы будут функциями constexpr. Например, скажем, у меня есть какой-то тип со следующим интерфейсом:
class someType
{
someType operator + (const someType &rhs);
someType operator * (const someType &rhs);
};
Операторы + и * не constexpr. Если я напишу следующий код:
fma(someType(), someType(), someType());
Он не должен компилироваться, потому что функция constexpr вызывает функции, не являющиеся constexpr. Но компилируется отлично. Почему это?
Я использую компилятор MinGW G ++ с параметром -std = c ++ 0x.
constexpr someType dummy = fma(someType(), someType(), someType());
;) - person mfontanini   schedule 09.09.2012constexpr
функции неявно встроены, если это сэкономит вам место. - person chris   schedule 09.09.2012