使用 *this 作为返回值
Use of *this as a return value
Sutter & 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.
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
}
}
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 是否可以将动态强制转换"this"作为返回值?
- 使用 *this 作为返回值