Per cplusplus.com, here,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
在这里,它又增加了什么?
[我认为我的问题不是该问题的重复(Difference between `constexpr` and `const`),因为我在问constexpr
的非常具体的用法,而这个问题是在问“告诉我有关const和constexpr的所有知识”。很难从大量的答案中找出具体用法,因为另一个问题的针对性和针对性不足,无法将答案直接带到我的问题的重点。
这意味着该函数可以在常量表达式中使用,例如:
constexpr int f = max(3, 4);
保证在编译时评估f
。
请注意,标记为constexpr
的函数可能同时具有编译时和运行时两种情况,具体取决于函数自变量(如果是函数模板,则还包含模板参数)。它必须至少具有1个编译时情况。
自C ++ 11起,许多标准库函数都添加了constexpr
。
constexpr
向编译器指示可以在编译时计算函数的结果(假定参数在运行时也已知)。我认为这个主题很好地总结了您想知道的内容:Difference between `constexpr` and `const`
我正在阅读,在这种情况下,它看起来像是修饰符,而不是返回类型,而是函数本身。 constexpr
表示max()
是constexpr
功能。 const T&
部分表示函数返回对类型const
的T
引用,而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***