C++ 评价流算子>&燃气轮机;作为布尔值

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;

以下代码在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;
如果((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
    是一个扩展为空指针常量的宏,而不是“空指针常量”,也不是术语“空指针常量”的同义词。