Статический полиморфизм в C ++

#include <iostream>

template<typename Impl>
struct renderer{
    void get(){
        static_cast<Impl*>(this)->get();
    }
};
struct open_gl : public renderer<open_gl>{
    void get(){
        std::cout << "OpenGL" << std::endl;
    }
};
struct direct_draw : public renderer<direct_draw>{
    void get(){
        std::cout << "DX" << std::endl;
    }
};
template<typename T>
void print_renderer(renderer<T> r){
    r.get();
}
int main() {
    auto gl = open_gl();
    auto dx = direct_draw();
    print_renderer(gl);
    print_renderer(dx);
}

Почему я не могу изменить параметр print_renderer наvoid print_renderer(const renderer<T> &r)? cannot convert 'this' pointer from 'const renderer<open_gl>' to 'renderer<open_gl> &' `

Почему я получаю ошибку времени выполнения, когда переименовываю методget в open_gl от get до get1? Разве это не должно вызвать ошибку компилятора?Error = Stack overflow

** Обратите внимание, я использую последнюю версию MSVC

Ответы на вопрос(2)

Ваш ответ на вопрос