Почему `constexpr` является частью прототипа шаблона C ++ 14 для` std :: max () `? - PullRequest
0 голосов
/ 26 апреля 2020

Для cplusplus.com, здесь , прототип C ++ 11 по умолчанию для std::max():

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` ), потому что я спрашиваю об очень конкретном c использовании constexpr, тогда как этот вопрос задает "скажи мне все, что знаешь о const и constexpr ". Специфическое использование c чрезвычайно трудно найти из этих массивных ответов, потому что этот другой вопрос недостаточно указан и достаточно c, чтобы привести ответы прямо к сути моего вопроса.

:

  1. Эта информация (этот вопрос плюс то, что я узнал из моего ответа и других здесь) просто вошла в мой ответ здесь: MIN и MAX в C
  2. Разница между `constexpr` и` const`
  3. std :: max () и std :: min () не constexpr

Ответы [ 3 ]

3 голосов
/ 26 апреля 2020

Это означает, что функцию можно использовать в константных выражениях, например:

constexpr int f = max(3, 4);

гарантирует, что f вычисляется во время компиляции.

Обратите внимание, что функция помечена constexpr может иметь как варианты времени компиляции, так и времени исполнения в зависимости от аргументов функции (и параметров шаблона, если это шаблон функции). В нем должен быть хотя бы 1 регистр времени компиляции.

Начиная с C ++ 11 во многие стандартные библиотечные функции добавлено constexpr.

1 голос
/ 26 апреля 2020

constexpr указывает компилятору, что результат функции может быть вычислен во время компиляции (учитывая, что параметры также известны во время выполнения). Я думаю, что эта топи c довольно хорошо суммирует то, что вы хотите знать: Разница между `constexpr` и` const`

0 голосов
/ 26 апреля 2020

Я читал, и похоже, что это модификатор в данном случае не для типа возврата, а для самой функции. 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***

Связанный:

  1. Эта информация только что вошла в мой ответ здесь: MIN и MAX в C
...