Иногда удобно или даже необходимо иметь функцию, которая имеет только один оператор (это необходимо при возврате constexpr
). Если необходимо проверить условие и разрешить только один оператор, единственным условием является условный оператор. В случае ошибки было бы неплохо выбросить исключение из условного оператора, например:
template <typename It>
typename std::iterator_traits<It>::reference
access(It it, It end) {
return it == end? throw std::runtime_error("no element"): *it;
}
Вышеуказанная функция не компилируется, однако, когда используется, например, как (живой пример):
std::vector<int> v;
access(v.begin(), v.end());
Компилятор жалуется на попытку привязки ссылки const
к временному. Компилятор, однако, не жалуется на throw
-expression. Итак, вопрос: можно ли исключить исключения из условного оператора, и если да, то что происходит с вышеуказанным кодом?