RAII-style lockable objects
first I suggest you use pointers to keep the mutex reference; this makes it possible to have a non-owning state when the pointer is 0 (the state when default initialized)

also you created a copy constructor and a destructor, so you still need a copy assignment to properly follow rule of 3 (or at least disable it)

GetLock&lt;TLOCKABLE&gt;&amp; operator=(const GetLock&lt;TLOCKABLE&gt;&amp; plock) {
    if(plock.lock != lock){
        GetLock&lt;TLOCKABLE&gt; tmp(plock); 
        swap(tmp);

    }
    return *this;
}


however this keeps the assumption that the lock is recursively-lockable, but as an optimization it won't reacquire and release when the locks are the same