2016-09-06 54 views
7

考慮這個單元測試:爲什麼std :: swap不能使用std :: bitset <n>的內容?

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

雖然這一次沒有:

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

bitset's operator []'返回一個代理對象 –

回答

8

此:

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

應實際編譯失敗。 operator[]對於std::bitset不返回引用,它返回一個代理對象。該代理對象不是一個左值,因此它不能綁定到T&std::swap。我假設它的編譯意味着你使用的MSVC有一個擴展名,允許將臨時綁定到非const引用 - 此時你可能只是交換代理,而不是代理實際上是什麼指的是。


側面說明:這個名字_Count由標準保留,因爲它是用_跟着一個大寫字母開頭的任何其他名稱。

+0

但爲什麼你鏈接的文檔說有一個版本返回一個引用('(2)reference operator [](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

相關問題