C++ 使用*this作为返回值

C++ 使用*this作为返回值,c++,C++,Sutter&Alexandrescu的编码标准中的一个例子引起了我的注意 示例2:std::string::append(后置条件错误)。将字符追加到字符串时,如果现有缓冲区已满,则无法分配新缓冲区,将阻止操作执行其记录的功能并实现其记录的后置条件,因此是一个错误 我无法想象,在任何正常情况下,人们都会检查append的返回值,但我很好奇该值是什么,结果它是*this(只能在非静态成员函数中使用)。我想可以检查追加前后的字符串长度, 但是,如何才能访问*这个 例如: std::string::

Sutter&Alexandrescu的编码标准中的一个例子引起了我的注意 示例2:
std::string::append
(后置条件错误)。将字符追加到字符串时,如果现有缓冲区已满,则无法分配新缓冲区,将阻止操作执行其记录的功能并实现其记录的后置条件,因此是一个错误

我无法想象,在任何正常情况下,人们都会检查append的返回值,但我很好奇该值是什么,结果它是
*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.
std::string::s=“Hello World”;

对于(int i=0;i在
string
等工具以及大多数标准库中的错误检查是通过异常完成的,而不是通过返回值

如果
append
失败,它将通过异常退出,否则,操作成功并获得有效的返回值。因此,检查返回值中的错误既不必要也不可能


如评论中所指出的,所述返回值可用于链操作等。

如果您确实愿意,可以将返回值缓存在循环中的局部变量中并检查其内容,但这是多余的:

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
  }
}
std::string s=“Hello World”;

对于(int i=0;它的返回值不是用于检查的。它是用于使用的。我认为返回值在那里,这样您就可以编写诸如
std::cout之类的东西。难道您不能也使用返回值来链接方法调用吗?例如
s.append(“Something”).append(“另一个字符串”);
?可能性是无穷的:-)以及
substr()注意:我对C++和java的了解比C++更为熟悉,如果我在语法上犯了错误(不知道缓存的值应该是指针还是引用,或者只是字符串),有人可以确信验证我的代码示例,或者修复它。.@black我不太明白这怎么会更正确,“退出”有什么错?因为异常就是这样做的:离开当前的程序控制流。异常本身不会“退出”任何东西。