【问题标题】:What implicit conversions happen with istream?istream 会发生哪些隐式转换?
【发布时间】:2013-06-05 07:18:08
【问题描述】:

我找到了一段 C-ish C++ 代码,并问自己一个(有点学术性的)问题,这里发生了哪些隐式类型转换才能到达if 需要的bool

int val;
if( (std::cin >> val) == 0 )
    ...

我已经走到这一步了:

  • std::cin >> val 返回(参考)cin,因此 istream&
  • 因此== 接收cin0 作为操作数,即istreamint

我认为没有可用的bool operator==(istream&, int)(也没有istream 中的相应成员函数),所以是否涉及转换


为了清楚起见,程序员的意图是检查输入是否成功,即应该写成if(!(std::cin >> val))

【问题讨论】:

  • 返回类型是istream&,而不是istream。后者会将实际对象切割成几乎无用的对象。
  • @PeteBecker 当然。我也注意到了。我认为不值得在类似句子的文本中更正,但现在我会的。谢谢。
  • 请告诉我们int i = cin; 是否为您编译。
  • @curiousguy 为什么要这样做?你的意思是因为operator bool() 被定义并且那个转换为int 隐式?嗯...我认为这行不通。另外,我对 Standard 感兴趣,而不是特定的实现,这可能是错误的。我认为在“[ios.overview]”(27.5.5.1)中,您可以看到ios_base 上没有定义operator int(),我想其他流类上也没有。所以,问题仍然存在,编译器会选择不同的explicit 转换运算符(bool)然后我要求(int)吗?
  • @towi std 的 iostream 部分发生了显着的演变(不是在一般概念和基本内容中,而是在许多技术细节中)。您的 iostream 实现可能已过时。另外,说实话:我也是出于好奇而询问

标签: c++ boolean implicit-conversion istream


【解决方案1】:

我认为没有可用的bool operator==(istream&, int) [...] 那么是否涉及转换?

的确如此。有一个conversion operator to bool,如果没有发生错误则返回true,否则返回false

根据 C++11 标准的第 27.5.5.4/1 段:

explicit operator bool() const;

1 返回!fail()

所以表达式 (cin >> val) 会返回一个(引用)cin,它是 == 的左操作数。右操作数是0

现在cin 可以转换为bool,并且可以与0 进行比较。换句话说,您的if 语句相当于:

if (!(std::cin >> val))
{
    // ...
}

【讨论】:

  • 是的,我知道。但这是否意味着cin ins 转换为bool0 转换为bool 然后调用operator==(bool,bool)
  • @towi: cin 转换为boolval 不是== 的操作数。 == 的操作数是 cin0
  • 是的,我的意思是 0,而不是 val 作为 == 的操作数。我的错。我会更新这个问题。这不会改变我的问题,因为两者都是int
  • @towi: cin 可以转换为bool,这样就可以与int 进行比较。我编辑了我的答案以澄清这一点。
  • 只是为了让以后的阅读能够关注我们:在您第二次编辑您的答案后,您确定了我的问题。谢谢。我现在可以删除我的其他 cmets :-)
【解决方案2】:

我认为编写的代码格式不正确。

如果您在没有优化和输出汇编的情况下进行编译,您可能会看到这里调用了哪个运算符或转换函数:

#include <istream>

void f(std::istream &is)
{
    is==0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多