根据 cplusplus.com,这里,std::max()
的默认 C++11 原型是:
template <class T>
const T& max(const T& a, const T& b);
然而,在 C++14 版本中,添加了constexpr
:
template <class T>
constexpr const T& max(const T& a, const T& b);
为什么constexpr
在这里,它增加了什么?
关于可能重复的说明
我认为我的问题不是这个问题的重复("constexpr"和"const"之间的区别),因为我问的是constexpr
的一个非常具体的用法,而这个问题是问"告诉我你所知道的关于 const 和 constexpr 的一切"。具体的用法很难从这些庞大的答案中挖掘出来,因为另一个问题不够尖锐和具体,无法将答案直接推向我的问题。
相关:
- 这些信息(这个问题加上我从我的答案和这里的其他人那里学到的东西)只是进入了我的答案:C 中的最小和最大 ">
- constexpr"和"const"之间的区别
- std::max() 和 std::min() 不是 constexpr
这意味着该函数可以在常量表达式中使用,例如:
constexpr int f = max(3, 4);
保证在编译时计算f
。
请注意,标记为constexpr
的函数可能同时具有编译时和运行时情况,具体取决于函数参数(如果是函数模板,则为模板参数)。它必须至少具有 1 个编译时大小写。
自 C++11 以来,许多标准库函数都添加了constexpr
。
constexpr
向编译器指示函数的结果可以在编译时计算(假设参数在编译时也是已知的)。我认为这个主题很好地总结了你想知道的内容: "constexpr"和"const"之间的区别
我正在做一些阅读,在这种情况下,它似乎不是在返回类型上是一个修饰符,而是在函数本身上。constexpr
说max()
是一个constexpr
函数。const T&
部分表示该函数返回对类型T
的const
引用,而constexpr
部分再次修改函数本身。
此引用 (https://en.cppreference.com/w/cpp/language/constexpr) 通过其示例指示constexpr
函数是一个可以在编译时计算的函数,但如果不是在编译时,它将像任何其他普通函数一样在运行时计算。
上述参考中的代码片段(添加了星号):
constN<factorial(4)> out1; // computed at ***compile time***
volatile int k = 8; // disallow optimization using volatile
std::cout << k << "! = " << factorial(k) << 'n'; // computed at ***run time***
相关:
- 这些信息刚刚进入了我的答案:C 中的最小和最大