为什么 std::swap 不适用于 std::bitset<n> 内容?
Why std::swap does not work with std::bitset<n> content?
考虑这个单元测试:
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”
为什么 swap 做错了?
这个:
std::swap( bitset[pos], bitset[_Count-pos-1] );
应该实际编译失败。 operator[]
对于 std::bitset
不是 return 引用,它 return 是一个代理对象。该代理对象不是左值,因此它不能绑定到 std::swap
中的 T&
。我假设它完全可以编译这一事实意味着您正在使用 MSVC,它具有允许将临时对象绑定到非 const
引用的扩展 - 此时您可能只是交换代理而不是什么代理实际上指的是。
旁注:名称 _Count
由标准保留,任何其他以 _
开头后跟大写字母的名称也是如此。
考虑这个单元测试:
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”
为什么 swap 做错了?
这个:
std::swap( bitset[pos], bitset[_Count-pos-1] );
应该实际编译失败。 operator[]
对于 std::bitset
不是 return 引用,它 return 是一个代理对象。该代理对象不是左值,因此它不能绑定到 std::swap
中的 T&
。我假设它完全可以编译这一事实意味着您正在使用 MSVC,它具有允许将临时对象绑定到非 const
引用的扩展 - 此时您可能只是交换代理而不是什么代理实际上指的是。
旁注:名称 _Count
由标准保留,任何其他以 _
开头后跟大写字母的名称也是如此。