Sutter& Sons的一个例子。 Alexandrescu的编码标准引起了我的注意
"示例2:std::string::append
(后置条件错误)。将字符附加到字符串时,如果现有字符已满,则无法分配新缓冲区会阻止操作执行其记录的函数并实现其记录的后置条件,因此是错误。"
我无法想象在任何正常情况下都会检查追加的返回值,但很奇怪这个值是什么,结果是*this
(只能在里面使用)非静态成员函数)。我想可以检查追加前后的字符串长度,
但是如何才能访问*this
?
例如:
std::string::s = "Hello World";
for (int i=0; i<many millions; ++i) {
s.append(s);
}
s.append("."); // Which we assume fails due to a buffer error.
答案 0 :(得分:6)
错误检查string
等设施以及大多数标准库是通过异常完成的,而不是通过返回值。
如果append
失败,它将通过异常退出,否则,操作成功并获得有效的返回值。因此,既不必要也不可能检查返回值中的错误。
正如评论中所指出的那样,所述返回值可用于例如连锁经营。
答案 1 :(得分:0)
如果你真的想,你可以将返回值缓存在循环中的局部变量中并检查它的内容,但这将是多余的:
std::string s = "Hello World";
for (int i=0; i<many millions; ++i)
{
std::string s2 = s.append(s);
if (s2.size() == 42)
{
break; // or some kind of check
// but as others said, exceptions are better
}
}