Il costruttore di copia riceve l'argomento per const reference:
codice:
class test{
    public:
        test(int a){
            this->val = a;
        }
        test(const test &a){
            this->val = a.val;
        }
    private:
        int val;
};

int main(){
    test t1 = 5;
    test t2(5);
}
---
Il punto è questo: quando tu scrivi
codice:
test t1 = 5;
c'è di mezzo una chiamata al costruttore che accetta int e una chiamata al costruttore di copie; di fatto, è equivalente a:
codice:
test t1(test(5));
In questo blocco, test(5) è un temporary, che non può essere passato per riferimento al tuo "costruttore di copie senza const" dato che i reference non const non possono bindare oggetti temporanei. Da lì l'errore.