求值语句cin==(表达式)
evaluating statement cin==(expression)
下面的代码打算做什么?
return cin==(cout<<(f(a)==f(b)?"YES":"NO"));
假设f()是一个字符串返回函数,a和b也是字符串,函数的签名是
string f(string a)
提前感谢!
答案是:这取决于您正在编译的c++标准。它可以归结为std::basic_ios
这里,我们有operator void*() const
,它:
因此,在表达式中:如果
fail()
返回true
,则返回空指针,否则返回非空指针。该指针可隐式转换为bool
,并可在布尔上下文中使用。
cin==(cout<<(f(a)==f(b)?"YES":"NO"));
我们将输出"YES"或"NO",流输出的结果仍然是cout
(以std::ostream&
的形式)。当我们进行相等性检查时,两个操作数将隐式转换为void*
,因此表达式将检查两个流是否失败。这是一种特别复杂的操作方式:
cout << (f(a) == f(b) ? "YES" : "NO");
return cin.fail() && cout.fail();
c++ 11 在c++ 11中,operator void*() const
被explicit operator bool() const
取代。explicit
是关键,因为它意味着转换函数只能显式使用(如通过直接强制转换)或在布尔上下文中使用,如:
if (cin) { // calls cin.operator bool()
}
相等不是布尔上下文,所以在表达式
中cin == cout
转换函数将不会被调用。由于没有在std::basic_ios
(或std::istream
或std::ostream
)上定义operator==
,因此表达式将无法编译。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- C++中的cin.ignore()函数不适用于整个流
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 如何确认我的constexpr表达式实际上已经在编译时执行
- Problems with std::cin.fail()
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 我如何评估来自CIN的变量的表达式
- 如何在条件表达式中使用 'cin' 正确退出 while 循环?(C++,CLion)
- 求值语句cin==(表达式)