如果您违反对模板类型的任何要求、提供错误的函数参数或任何其他违约行为,标准库通常会允许未定义的行为。在用户库中允许这样做是否被认为是一种好习惯?什么时候这样做是公平的?
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
语句的情况下到达函数的末尾 - 这会产生未定义的行为。
图书馆开发人员是否应该因为允许这样做而感到难过?