【问题标题】:Difference of behavior between libstdc++ and libc++: operator>> on bitsetlibstdc++ 和 libc++ 之间的行为差​​异:bitset 上的 operator>>
【发布时间】:2017-04-07 02:02:45
【问题描述】:

考虑以下代码:

#include <bitset>
#include <sstream>
#include <iostream>

int main(int argc, char* argv[])
{
    std::stringstream stream;
    std::bitset<1> bitset(1);
    std::cout<<"before = "<<bitset[0]<<std::endl;
    stream<<"4";
    stream>>bitset;
    std::cout<<"after = "<<bitset[0]<<std::endl;
    return 0;
}

g++libstdc++下编译,结果为:

> g++ bitset_empty.cpp -o bitset_empty
> ./bitset_empty 
before = 1
after = 1

clang++libc++下编译,结果为:

> clang++ -stdlib=libc++ bitset_empty.cpp -o bitset_empty
> ./bitset_empty 
before = 1
after = 0

哪一个是对的?两者(因为未定义的行为)?海合会?叮当?

【问题讨论】:

    标签: c++ gcc clang std std-bitset


    【解决方案1】:

    据我了解,libc++ 就在这里,但它不是唯一正确的行为。

    N4140 §20.6.4 [bitset.operators]

    效果: 从 is 中提取最多 N 个字符。将这些字符存储在 basic_string<charT, traits> 类型的临时对象 str 中,然后计算表达式 x = bitset&lt;N&gt;(str)。 字符被提取和存储,直到发生以下任何一种情况:

    • 已提取并存储了 N 个字符;
    • 文件结束出现在输入序列上;
    • 下一个输入字符既不是is.widen(’0’) 也不是is.widen(’1’)(在这种情况下,不会提取输入字符)。

    如果str 中没有存储任何字符,则调用 is.setstate(ios_base::failbit)(可能会抛出 ios_base::failure (27.5.5.4))

    请务必注意,x = bitset&lt;N&gt;(str) 不是有条件的。如果ios_base::failure 没有被抛出,那么这就是执行的表达式。而bitset&lt;N&gt;(""s)(即空字符串)是0

    因此,据我了解,您的 bitset 应该归零,或者应该抛出上述异常。

    如果没有抛出异常,您可能需要测试您的操作是否成功(通过测试返回的流)。

    【讨论】:

      【解决方案2】:

      你应该检查是否

      stream>>bitset;
      

      成功。如果没有,那之后你就不能指望bitset 的值了。

      #include <bitset>
      #include <sstream>
      #include <iostream>
      
      int main(int argc, char* argv[])
      {
          std::stringstream stream;
          std::bitset<1> bitset(1);
          std::cout<<"before = "<<bitset[0]<<std::endl;
          stream<<"4";
          if ( stream>>bitset )
          {
             std::cout<<"after = "<<bitset[0]<<std::endl;
          }
          else
          {
             std::cout << "Failed to restore bitset from stream.\n";
          }
          return 0;
      }
      

      使用 g++ 4.9.3 输出:

      before = 1
      Failed to restore bitset from stream.
      

      【讨论】:

        猜你喜欢
        • 2012-02-18
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 2018-05-10
        • 1970-01-01
        相关资源
        最近更新 更多