为什么std :: swap不能用于std :: bitset <n>内容?

时间:2016-09-06 13:35:44

标签: c++ c++11 swap bitset

考虑这个单元测试:

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”

为什么交换做错了?

1 个答案:

答案 0 :(得分:8)

此:

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

实际上无法编译。 std::bitset的{​​{3}}不返回引用,它返回一个代理对象。该代理对象不是左值,因此无法绑定到T&中的std::swap。我假设它在某种程度上编译你正在使用MSVC,它有一个扩展,允许绑定临时值到非const引用 - 此时你可能只是交换代理而不是什么代理人实际上指的是。

旁注:名称_Count由标准保留,任何其他名称以_后跟大写字母开头。