考虑以下代码:
template<typename T>
constexpr inline T fma(T a, T b, T c)
{
return a * b + c;
}
这编译得很好。但为什么会这样?理论上,constexpr 函数只能调用其他constexpr 函数。但是,不能保证运算符将是 constexpr 函数。例如,假设我有一些具有以下接口(interface)的类型:
class someType
{
someType operator + (const someType &rhs);
someType operator * (const someType &rhs);
};
运算符 + 和 * 不是常量。如果我写下面的代码:
fma(someType(), someType(), someType());
它应该无法编译,因为 constexpr 函数正在调用非 constexpr 函数。但它编译得很好。这是为什么?
我正在使用带有 -std=c++0x 选项的 MinGW 的 G++ 编译器。
最佳答案
如果使用非常量表达式作为参数调用 constexpr 函数,该函数将在运行时执行。
如果你这样做:
constexpr someType dummy = fma(someType(), someType(), someType());
它将失败,因为您强制将结果存储在 constexpr
类型中。这不能在编译时完成,因此会出现编译错误。
请注意,如果您同时提供了 constexpr
构造函数和 constexpr
operator+/*
,这将起作用一些类型
。
关于c++ - 为什么 constexpr 与模板一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12336348/