为什么"constexpr"是"std::max()"的C++14模板原型的一部



根据 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 的一切"。具体的用法很难从这些庞大的答案中挖掘出来,因为另一个问题不够尖锐和具体,无法将答案直接推向我的问题。

相关:

  1. 这些信息(这个问题加上我从我的答案和这里的其他人那里学到的东西)只是进入了我的答案:C 中的最小和最大
  2. ">
  3. constexpr"和"const"之间的区别
  4. std::max() 和 std::min() 不是 constexpr

这意味着该函数可以在常量表达式中使用,例如:

constexpr int f = max(3, 4);

保证在编译时计算f

请注意,标记为constexpr的函数可能同时具有编译时和运行时情况,具体取决于函数参数(如果是函数模板,则为模板参数)。它必须至少具有 1 个编译时大小写。

自 C++11 以来,许多标准库函数都添加了constexpr

constexpr

向编译器指示函数的结果可以在编译时计算(假设参数在编译时也是已知的)。我认为这个主题很好地总结了你想知道的内容: "constexpr"和"const"之间的区别

我正在做一些阅读,在这种情况下,它似乎不是在返回类型上是一个修饰符,而是在函数本身上。constexprmax()是一个constexpr函数。const T&部分表示该函数返回对类型Tconst引用,而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***

相关:

  1. 这些信息刚刚进入了我的答案:C 中的最小和最大

相关内容

最新更新