Стандартная библиотека обычно допускает неопределенное поведение, если вы нарушаете любые требования к типам шаблонов, даете ошибочные аргументы функции или любое другое нарушение контракта. Является ли это хорошей практикой, позволяющей это делать в пользовательских библиотеках? Когда это справедливо?Когда справедливо целенаправленно вызывать неопределенное поведение?
Рассмотрит написание operator[]
для контейнера:
template <typename t>
T& container<T>::operator[](int i)
{
return internal_array[i];
}
Если i
индексов вне пределов internal_array
, мы попали неопределенное поведение. Должны ли мы позволить этому произойти или выполнить проверку границ и выбросить исключение?
Другим примером является функция, которая принимает int
аргумент, но только позволяет ограниченный домен:
int foo(int x)
{
if (x > 0 && x <= 10) {
return x;
}
}
Если x
не находится в пределах области, исполнение достигнет конца функции без return
заявления - это дает неопределенное поведение.
Должен ли разработчик библиотеки чувствовать себя плохо для разрешения этого или нет?
Может быть, лучше подходит для программистов, я не знаю. – chris
Лично: Если легко отладить диагностику в сборке отладки (например, с помощью утверждений или чего-то еще), я всегда нахожу это. Реализации стандартной библиотеки по крайней мере иногда следуют аналогичным рекомендациям: '[]' часто проверяет границы в отладочных сборках. ** Но ** никогда не было причин вызывать неопределенное поведение, если вы можете избежать его без дополнительных затрат времени исполнения - если вы уже проводите проверку границ, дайте хорошую диагностику. – Voo
@chris Возможно. Я не был уверен. –