2016-09-06 8 views
7

は、このユニットテストを考えてみましょう:std :: bitset <n>コンテンツでstd :: swapが動作しないのはなぜですか?

std::bitset<8> temp("11010100"); 
reverseBitSet(temp); 
CPPUNIT_ASSERT(temp == std::bitset<8>("00101011")); 

この実装では動作します:

template<size_t _Count> static inline void reverseBitSet(std::bitset<_Count>& bitset) 
{ 
    bool val; 
    for (size_t pos = 0; pos < _Count/2; ++pos) 
    { 
     val = bitset[pos]; 
     bitset[pos] = bitset[_Count-pos-1]; 
     bitset[_Count-pos-1] = val; 
    } 
} 

この1つはしませんが:

template<size_t _Count> static inline void reverseBitSet(std::bitset<_Count>& bitset) 
{ 
    for (size_t pos = 0; pos < _Count/2; ++pos) 
    { 
     std::swap(bitset[pos], bitset[_Count-pos-1]); 
    } 
} 

結果が "11011011" の代わりに "00101011"

です

スワップが間違っているのはなぜですか?

+0

ビットセットの 'operator []'はプロキシオブジェクトを返します –

答えて

8

これは:

std::swap(bitset[pos], bitset[_Count-pos-1]); 

実際のコンパイルに失敗する必要があります。 std::bitsetoperator[]は参照を返しません。プロキシオブジェクトを返します。そのプロキシオブジェクトは左辺値ではないため、のT&にバインドすることはできません。私はそれがすべての意味でコンパイルするという事実を前提としています。MSVCを使用しており、一時的なバインディングを非拘束にすることができます。constの参照 - おそらくプロキシを交換していて、を参照してください。


余談:大文字が続く_で始まり、他の名前であるとして名前_Countは、標準で予約されています。

+0

しかし、リンクしたドキュメントに参照( '(2)参照演算子[](std :: size_t pos);)を返すバージョンがあるというのはなぜですか? – jpo38

+1

@ jpo38参照を返すとは限りません。それは、タイプ['std :: bitset :: reference'](http://en.cppreference.com/w/cpp/utility/bitset/reference)のオブジェクトを返すと言います(これは間違いなく混乱させます)。 – Barry

+1

@ jpo38その_reference_は 'std :: bitset :: reference'です。これは答えに記載されているプロキシオブジェクトです。 – skypjack

関連する問題