Czy można bezpiecznie deklarować następującą funkcję: noexcept
, mimo że v.at(idx)
teoretycznie może wyrzucić wyjątek out_of_range
, ale praktycznie nie z powodu sprawdzenia granic?Czy teoretycznie, ale nie praktycznie, funkcja rzucania nie może być zadeklarowana?
int get_value_or_default(const std::vector<int>& v, size_t idx) noexcept {
if (idx >= v.size()) {
return -1;
}
return v.at(idx);
}
Plus, ale niekoniecznie jest to bezpieczne. Co się dzieje, gdy inny wątek modyfikuje 'v'? – Bathsheba
@Bathsheba, kod ma niezdefiniowane zachowanie, ponieważ wywołuje 'v.size()' i 'v.at (idx)' bez synchronizacji, więc nie ma sensu martwić się o takie rzeczy. Albo tak się nie stanie, albo program ma większe problemy. –
Ten kod nie jest bezpieczny dla wątków. Wydaje się jednak, że pytanie dotyczy tylko pojedynczego wątku. –