c++ - 为什么 constexpr 与模板一起工作?

标签 c++ operator-overloading constexpr constant-expression

考虑以下代码:

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/

相关文章:

c++ - 在 constexpr 函数中切换

c++ - 用概念重载函数

c++ - 使用 MinGW 在 Windows 上编译到 Linux?

c++ - 重载运算符中没有隐式转换

c++11 - 浮点除以零不是 constexpr

c++ - 函数返回 constexpr 不编译

c++ - 如何更改 Visual Studio 2012 (C++) 中的默认 .exe 图标

c++ - 使用逻辑运算符时无法理解执行情况

c++ - 为什么赋值运算符重载会创建一个对象的拷贝?

C++ 添加 2 个 3D vector 返回垃圾值