constexpr const_reference at(size_type pos) const;
Как эта перегрузка STL-контейнеров может работать с параметрами неконференции? Каковы классические варианты использования этой перегрузки?оператор-оператор состязания для контейнеров STL
constexpr const_reference at(size_type pos) const;
Как эта перегрузка STL-контейнеров может работать с параметрами неконференции? Каковы классические варианты использования этой перегрузки?оператор-оператор состязания для контейнеров STL
В объявлении функции нет таких параметров, как constexpr
. A constexpr
вызов функции может быть оценен только во время компиляции тогда и только тогда, когда все параметры, участвующие в вызове этой функции, являются постоянными выражениями.
Это, как говорится, единственный случай, когда функция constexpr
должна оцениваться во время компиляции, когда она используется для вычисления параметра шаблона.
Как минимум один вариант использования для примера, который вы даете, для std::array::at
.
Как эта перегрузка контейнеров-аксессуаров 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
Действительно аккуратный fearure является то, что компилятор обязательно жалуется, что элемент находится вне границ, если 'станда: : array :: at' оценивается в контексте 'constexpr', поскольку' throw', который 'at' does не является' constexpr'. –
Yakk