2013-12-04 4 views

ответ

8

В объявлении функции нет таких параметров, как constexpr. A constexpr вызов функции может быть оценен только во время компиляции тогда и только тогда, когда все параметры, участвующие в вызове этой функции, являются постоянными выражениями.

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

Как минимум один вариант использования для примера, который вы даете, для std::array::at.

+2

Действительно аккуратный fearure является то, что компилятор обязательно жалуется, что элемент находится вне границ, если 'станда: : array :: at' оценивается в контексте 'constexpr', поскольку' throw', который 'at' does не является' constexpr'. – Yakk

6

Как эта перегрузка контейнеров-аксессуаров STL работает с параметрами, отличными от constexpr?

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

Его все еще можно вызывать с непостоянными аргументами; вы просто не можете использовать результат как постоянное выражение.

Что такое классические случаи использования этой перегрузки?

Получение времени компиляции постоянная из подходящей емкости, например:

constexpr std::array<int,5> values {{2,3,5,7,11}}; 

template <int n> void do_stuff(); // needs a compile-time constant 
do_stuff<values.at(3)>();   // provide a compile-time constant 
Смежные вопросы