C++ 评价流算子>&燃气轮机;作为布尔值
以下代码在Visual Studio 2008中编译,但在Visual Studio 2013及更高版本中失败C++ 评价流算子>&燃气轮机;作为布尔值,c++,c++11,visual-c++,type-conversion,language-lawyer,C++,C++11,Visual C++,Type Conversion,Language Lawyer,以下代码在Visual Studio 2008中编译,但在Visual Studio 2013及更高版本中失败 std::string str("foo"); std::stringstream ss(str); float f = 0; if ((ss >> f) == false) std::cout << "Parse error\n"; std::string str(“foo”); std::stringstream ss(str); 浮点数f=0;
std::string str("foo");
std::stringstream ss(str);
float f = 0;
if ((ss >> f) == false)
std::cout << "Parse error\n";
std::string str(“foo”);
std::stringstream ss(str);
浮点数f=0;
如果((ss>>f)=假)
标准:cout>f)
std::cout自C++11以来,两种行为发生了变化
用户的行为发生了变化。
operator void*() const; (1) (until C++11)
explicit operator bool() const; (2) (since C++11)
注意,因为C++11操作符bool()
被声明为显式;但是对于if((ss>>f)==false)
,ss
(即(ss>>f)
)的返回值需要隐式转换为bool
(与false
进行比较),这是不允许的
空指针常量的定义已更改。
operator void*() const; (1) (until C++11)
explicit operator bool() const; (2) (since C++11)
在C++11之前,可以使用运算符void*()
,并且它不是显式的(在C++11之前没有这种类型),在C++11定义为:
计算结果为零的整数类型的整型常量表达式rvalue
(直到C++11)
这意味着false
可以用作空指针常量。因此,ss
可以隐式转换为void*
,然后与false
(作为空指针)进行比较
在C++11中,空指针常量定义为:
值为零的整数文本,或类型为std::nullptr\u t
(从C++11开始)
而false
不会再次出现;这不是一个好主意
因此,由于这两个更改,if((ss>>f)==false)
在C++11及更高版本中不起作用
std::string str("foo");
std::stringstream ss(str);
float f = 0;
if ((ss >> f) == false)
std::cout << "Parse error\n";
另一方面,if(!(ss>>f))
工作得很好,因为它(在C++11之前和之后)都有
如果关联流上发生错误,则返回true
。
具体来说,如果在rdstate()
中设置了badbit或failbit,则返回true
顺便说一句:从C++11开始,即使没有
std::basic\u ios::operator
,显式运算符bool()const
也可以使如果(!(ss>>f))
工作良好,因为在上下文中,考虑了显式
用户定义的转换;i、 e.ss
可以在上下文中转换为bool
以供操作员使用
值得一提的是,即使运算符bool
标记为explicit
,但if(foo)
或if(!foo)
仍然有效,这是因为运算符bool
的显式转换存在少数例外情况之一。例子。我相信这就是所谓的上下文转换,例如,…NULL
是一个扩展为空指针常量的宏,而不是“空指针常量”,也不是术语“空指针常量”的同义词。