考虑以下代码:
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 函数。但它编译得很好。为什么是这样?
我正在使用带有 -std=c++0x 选项的 MinGW 的 G++ 编译器。