C ++为什么bitvec [0] .flip()有效

时间:2010-11-24 05:36:34

标签: c++

基于C ++ Primer第4版(即第105页),

bitset<32> bitvec;

bitvec[0].flip(); // reverses the first bit.

我的问题是为什么第二行有效?基于

http://www.cplusplus.com/reference/stl/bitset/operator[]/

     bool operator[] ( size_t pos ) const;
reference operator[] ( size_t pos );

如何在bool或reference上使用bitset :: flit?

谢谢

2 个答案:

答案 0 :(得分:2)

它返回bitset<32>::reference的实例,该实例具有flip方法。更明确地说:

bitset<32> bs;
bitset<32>::reference first = bs[0];
first.flip();

答案 1 :(得分:2)

operator []返回的

“reference”不是C ++引用,它是一个具有flip()方法的特殊代理类。

伪代码:

class bitset
{
   class reference
   {
   public:
      reference& flip()
      {
         bitset_.flip(pos_);
         return *this;
      }

      reference(bitset& obj)
      : bitset_(obj), pos_(pos)
      {
      }

   bitset& bitset_;
   size_t pos_;
   };

   reference operator[](size_t pos)
   {
      return reference(*this, pos);
   }
}

有关详细信息,请参阅STL实现的源代码。