流输出和隐式void*cast运算符函数调用
stream output and implicit void* cast operator function invocation
类似的代码
cin>> grade;
其中grade是标准数据类型,返回对cin(istream对象)的引用,该引用启用级联输入
但我读到如果
cin >>grade;
在while语句中用作条件。。。流的void*cast运算符函数被隐式调用。。。它将对istream对象的引用转换为非null或null指针,这取决于上次输入操作的成功或失败。。。null指针转换为false,non-null转换为true。。。我的问题是:
- void*cast运算符函数是什么?它在这里是如何工作的
- 非null指针如何转换为true和null如何转换为false
1.void*cast运算符函数是什么?它在这里是如何工作的?
它看起来像这样:
operator void* () const {
return fail() ? 0 : this;
}
问题是:为什么这里不使用operator bool
?答案是:因为这允许无效的转换,这可能会隐藏错误。上面是安全布尔习语的一个例子。
然而,这种实施实际上已经过时了。这个习语有更好的实现;文章对此进行了解释。
2.如何将非空指针转换为真和将空指针转换成假
C++就是这样工作的:任何非空指针都被认为等价于条件中的true
。现在,为什么C++首先在这里调用operator void*
?
本质上,当C++看到一个意外类型的对象时,它会尝试应用一个隐式转换,使对象类型在此上下文中有效。因此,编译器尝试所有可用的隐式转换,并查看生成的类型在此上下文中是否可接受。
这种情况发生在她身上:编译器看到while (cin >> grade)
。它知道basic_istream
在while
条件的上下文中是无效的。因此,它发现存在一个operator void*
,并且void*
在该上下文中是有效的,因此C++应用了该转换。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 如何理解C++标准N3337中的expr.const.cast子句8
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- 流输出和隐式void*cast运算符函数调用