评估声明cin ==(表达式)

时间:2015-07-27 14:36:31

标签: c++ return-value cout cin

以下代码的目的是什么?

C:\Users\myuser\AppData\Local\Microsoft\Communicator\sip_user@domain\History Spooler 

假设f()是一个字符串返回函数,a和b也是字符串,函数的签名是

return cin==(cout<<(f(a)==f(b)?"YES":"NO")); 

提前致谢!

1 个答案:

答案 0 :(得分:4)

答案是:它取决于你正在编译的C ++标准。它归结为std::basic_ios

中的转换函数

<强> C ++ 03

在这里,我们有operator void*() const,其中:

  

如果fail()返回true,则返回空指针,否则返回非空指针。该指针可以隐式转换为bool,并且可以在布尔上下文中使用。

因此,在表达式中:

cin==(cout<<(f(a)==f(b)?"YES":"NO")); 

我们会打印&#34; YES&#34;或&#34;否&#34;,流输出的结果仍为cout(以std::ostream&的形式)。当我们进行相等性检查时,两个操作数将被隐式转换为void*,因此表达式会检查两个流是否都失败。这是一种特别晦涩的做法:

cout << (f(a) == f(b) ? "YES" : "NO");
return cin.fail() && cout.fail();

<强> C ++ 11

使用C ++ 11,operator void*() constexplicit operator bool() const取代。 explicit是关键,因为它意味着转换函数只能显式使用(如通过直接转换)或布尔上下文,如:

if (cin) { // calls cin.operator bool()
}

Equality不是布尔上下文,所以在表达式

cin == cout

不会调用转换函数。由于operator==(或std::basic_iosstd::istream)上没有定义std::ostream,因此表达式根本无法编译。