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?
The thing is that if type T
is int&
, then the type const T
is not const int&
, but int & const
. The illegal top-level const on a reference is ignored in template substitutions and typedef results.
If, on the other hand T
is const int
, then T&
is const int&
When TypeBufferFront is int&
, const TBufferTypeFront
is equivalent to int& const
, where the const is ignored during template substitution, since all references are constant, even if what they refer to is not.
So, when instantiated with int&
, your constructor is effectively FrontBackBuffer(int&, int&)
, which works as given.
This is an example of why many people will use T const
instead of const T
, to make it clearer how the substitution occurs, as well as allow them to read the cv-qualifiers from right to left.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With