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

问题描述 投票:0回答:3

Per cplusplus.com, herestd::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的所有知识”。很难从大量的答案中找出具体用法,因为另一个问题的针对性和针对性不足,无法将答案直接带到我的问题的重点。

相关:

  1. 此信息(此问题以及我从my answer和此处的其他人那里学到的东西)只是在这里进入我的答案:MIN and MAX in C
  2. Difference between `constexpr` and `const`
  3. std::max() and std::min() not constexpr
c++ templates const constexpr
3个回答
3
投票

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

constexpr int f = max(3, 4);

保证在编译时评估f

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

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


1
投票

constexpr向编译器指示可以在编译时计算函数的结果(假定参数在运行时也已知)。我认为这个主题很好地总结了您想知道的内容:Difference between `constexpr` and `const`


0
投票

我正在阅读,在这种情况下,它看起来像是修饰符,而不是返回类型,而是函数本身。 constexpr表示max()constexpr功能。 const T&部分表示函数返回对类型constT引用,而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. 此信息刚刚进入我的答案:MIN and MAX in C
© www.soinside.com 2019 - 2024. All rights reserved.