Search code examples
c++templatesconstructorconstantsdefault-constructor

Template neglects const (why?)


Does somebody know, why this compiles??

template< typename TBufferTypeFront, typename TBufferTypeBack = TBufferTypeFront>
class FrontBackBuffer{

public:


  FrontBackBuffer(
    const TBufferTypeFront  front, 
    const TBufferTypeBack back):    ////const reference  assigned to reference???
     m_Front(front),
     m_Back(back)
  {
  };

  ~FrontBackBuffer()
  {};

  TBufferTypeFront m_Front;       ///< The front buffer
  TBufferTypeBack m_Back;         ///< The back buffer

};

int main(){
    int b;
    int a;
    FrontBackBuffer<int&,int&> buffer(a,b); //
    buffer.m_Back = 33;
    buffer.m_Front = 55;
}

I compile with GCC 4.4. Why does it even let me compile this? Shouldn't there be an error that I cannot assign a const reference to a non-const reference?


Solution

  • For the code to do what you want it to do, it would have to read:

      FrontBackBuffer(
        typename std::remove_reference<TBufferTypeFront>::type const&  m_front, 
        typename std::remove_reference<TBufferTypeBack>::type const& m_back):    ////const reference  assigned to reference???
        m_Front(m_front),
        m_Back(m_back)
      {
      };
    

    which has the added "feature" that it turns other types into const references when used to construct FrontBackBuffer.

    Now this isn't perfect. This prevents temporary arguments to FrontBackBuffer from being moved, and passes even small cheap to copy types (like char) by reference instead of by value. There are standard C++0x techniques to do this that are a bit awkward to write if you care.