c++ - libstdc++ 和 libc++ : operator>> on bitset 行为差异

标签 c++ gcc clang std std-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";
    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

哪个是对的?两者(因为未定义的行为)?海湾合作委员会? clang ?

最佳答案

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

N4140 §20.6.4 [bitset.operators]

Effects: Extracts up to N characters from is. Stores these characters in a temporary object str of type basic_string<charT, traits>, then evaluates the expression x = bitset<N>(str). Characters are extracted and stored until any of the following occurs:

  • N characters have been extracted and stored;
  • end-of-file occurs on the input sequence;
  • the next input character is neither is.widen(’0’) nor is.widen(’1’) (in which case the input character is not extracted).

If no characters are stored in str, calls is.setstate(ios_base::failbit) (which may throw ios_base::failure (27.5.5.4))

重要的是要注意 x = bitset<N>(str)不是有条件的。如果ios_base::failure没有抛出,那么就是执行的表达式。和 bitset<N>(""s) (即空字符串)是 0 .

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

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

关于c++ - libstdc++ 和 libc++ : operator>> on bitset 行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40758070/

相关文章:

c++ - 将 double 转换为 float 时精度损失 1

ruby - gem install pg error : couldn't understand kern. osversion `14.0.0' on Yosemite w/Ruby 2.1.5

c++ - clang 左/右 3.6 倍表达式

linux - 是否有适用于 Linux 的 Clang mingw 交叉编译器

c - <stdatomic.h> 中的 atomic_store/load 是否适用于 Intel 上未对齐的跨缓存行数据?

c++ - 让VS自动将DLL复制到可执行输出目录

c++ - 我可以让 doxygen 将 @ref 解析为 C++ 标准库函数吗?

c++ - 我可以将 RetroArch 移植到 Native Client 吗

c++ - 基于ARM的系统中浮点到整数的转换

c - 如何将带有可变参数的函数声明为 stdcall?