Почему constexpr является частью прототипа шаблона C++14 для std::max()?

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

Связанные с:

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

3 ответа

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

constexpr int f = max(3, 4);

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

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

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

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

Я читал, и похоже, что в данном случае это модификатор не для возвращаемого типа, а, скорее, для самой функции. constexpr Говорит, что max() это constexprфункция. Вconst T& часть говорит, что функция возвращает const ссылка на тип T, в то время как constexpr part, опять же, изменяет саму функцию.

Эта ссылка ( https://en.cppreference.com/w/cpp/language/constexpr) указывает на своем примере, чтоconstexpr function - это функция, которая, возможно, может быть оценена во время компиляции, но если не во время компиляции, она будет оцениваться во время выполнения, как любая другая нормальная функция.

Фрагмент кода из приведенной выше ссылки (добавлены звездочки):

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
Другие вопросы по тегам