【发布时间】:2013-06-05 07:18:08
【问题描述】:
我找到了一段 C-ish C++ 代码,并问自己一个(有点学术性的)问题,这里发生了哪些隐式类型转换才能到达if 需要的bool?
int val;
if( (std::cin >> val) == 0 )
...
我已经走到这一步了:
-
std::cin >> val返回(参考)cin,因此istream& - 因此
==接收cin和0作为操作数,即istream和int
我认为没有可用的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