特别考虑 C++string类构造函数规范,我们有:
string (const string& str, size_t pos, size_t len = npos);
string (const char* s, size_t n);
Run Code Online (Sandbox Code Playgroud)
它们本质上具有相同的形式/意图,除了 string 和 c-string。然而,异常规范却非常不同:
如果 pos 大于 str 的长度,则会抛出 out_of_range 异常。
如果 n 大于 s 指向的数组,则会导致未定义的行为。
我想知道这是为什么?除了性能之外,什么时候抛出异常与允许“未定义的行为”是一个好主意?答案似乎取决于以下因素:
两种情况的区别在于,在第一种情况下,实现可以检查传递的参数是否有错误,而在第二种情况下则不可能(无法检查哪个是参数)字符串的长度,因为只传递了一个指针)。
所以一般规则可能如下: