2016-11-23 8 views
4

에 오퍼레이터 >> 다음 코드 고려해차이 : 비트 세트

#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; 
} 

libstdc++으로 g++ 따라 컴파일 된 결과이다 :

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

libc++으로 clang++에서 컴파일 결과는 다음과 같습니다.

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

어느 것이 옳은가요? 둘 다 (정의되지 않은 동작 때문에?)? GCC? 그 소리?

답변

2

, libc의 ++는 바로 여기이지만, 그것만이 올바른 행동이 아니다.

N4140 §20.6.4 [bitset.operators]

효과 :이다 추출물 N 문자로부터. 이 문자를 basic_string<charT, traits> 유형의 임시 개체 str에 저장하고 x = bitset<N>(str)이라는 식을 계산합니다. 문자는 다음 중 하나가 발생할 때까지 추출되고 저장됩니다.

  • N 문자가 추출되어 저장되었습니다.
  • end-of-file은 입력 순서에서 발생합니다.
  • 다음 입력 문자는 is.widen(’0’)이나 is.widen(’1’)이 아니며 입력 된 문자는 추출되지 않습니다. 어떤 문자가 str에 저장되지 않은 경우

은, 그것은 x = bitset<N>(str)은 조건없는 점에 유의하는 것이 중요 is.setstate(ios_base::failbit) (ios_base::failure (27.5.5.4)를 던질 수있는)

를 호출합니다. ios_base::failure이 발생하지 않으면 실행 된 표현식입니다. bitset<N>(""s) (즉, 빈 문자열)은 0입니다.

따라서 제 이해에서 bitset은 제로화되어야하며 앞에서 언급 한 예외가 발생해야합니다.

예외가 throw되지 않으면 반환 된 스트림을 테스트하여 작업이 성공했는지 테스트 할 수 있습니다.

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; 
} 

++ 4.9.3 g을 사용하여 출력 : 나의 이해에서

before = 1 
Failed to restore bitset from stream.