加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 流输出和隐式void *转换操作符函数调用

发布时间:2020-12-16 03:21:22 所属栏目:百科 来源:网络整理
导读:像这样的代码 cin grade; grade是标准数据类型返回对cin(istream对象)的引用,它启用级联输入…. 但我读到了如果 cin grade; 在while语句中用作条件…流的void * cast运算符函数被隐式调用…并且它将对istream对象的引用转换为非null或空指针,具体取决于上一
像这样的代码
cin>> grade;

grade是标准数据类型返回对cin(istream对象)的引用,它启用级联输入….
但我读到了如果

cin >>grade;

在while语句中用作条件…流的void * cast运算符函数被隐式调用…并且它将对istream对象的引用转换为非null或空指针,具体取决于上一次输入操作的成功或失败…并将空指针转换为false,将非null转换为true …我的问题是:

>什么是void * cast操作符函数以及它在这里是如何工作的
>如何将非空指针转换为true并将null转换为false

解决方法

1.what is the void * cast operator function and how does it work here

它看起来像这样:

operator void* () const {
    return fail() ? 0 : this;
}

问题是:为什么不是这里使用的运算符bool?答案是:因为这允许无效的转换,这可能隐藏错误.以上是safe bool idiom的一个例子.

但是,这种实现实际上已经过时了.这个成语存在更好的实现;文章解释了他们.

2.how is non-null pointer converted to true and null to false

这就是C的工作原理:任何非空指针都被视为在条件中等效为true.现在,为什么C首先在这里调用操作符void *?

实质上,当C看到一个意外类型的对象时,它会尝试应用一个隐式转换,使该对象类型在此上下文中有效.因此,编译器会尝试所有可用的隐式转换,并查看在此上下文中结果类型是否可接受.

这发生在她身上:编译器看到while(cin>> grade).它知道basic_istream在while条件的上下文中无效.因此它发现有一个运算符void *,并且void *在此上下文中有效,因此C应用此转换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读