我有一些现有的代码可以在Visual Studio 2010中编译好但是在Visual Studio 2013中出错。代码只是从istringstream中提取一个字符串并检查转换是否成功:
bool okFlag = false;
istringstream s;
string myStr;
<snip>
okFlag = s >> myStr;
错误是:
error C2440: '=' : cannot convert from 'std::basic_istream<char,std::char_traits<char>>' to 'bool'
我想在C ++ 11中,转换的返回类型不是bool。这样做的正确方法是什么?是否可以使代码满足VS2010和VS2013?
答案 0 :(得分:10)
在C ++ 11中basic_ios::operator bool
是explicit
,而C ++ 03用户定义到void *
的转换可以隐式转换为bool
。要修复代码,您需要显式地转换结果。
okFlag = static_cast<bool>(s >> myStr);
请注意,explicit bool
转换运算符仍会在需要布尔结果的上下文中隐式转换为bool
,例如if
语句中的条件表达式。这就是为什么下面的代码仍然编译而不必添加演员。
if(s >> myStr) { // here operator bool() implicitly converts to bool
// extraction succeeded
}