Sto scrivendo alcune unità di test usando googletest e googlemock e sono bloccato in un problema relativo ai puntatori e al polimorfismo di C ++ 11.
Supponi di avere queste classi:
class A {
public:
    virtual void doThings() {...};
};
class B {
private:
    B(std::unique_ptr<A> a): a_(std::move(a)) {}
    std::unique_ptr<A> a_;
};
 Voglio testare la classe   B    e quindi creo un mock per   A    e lo passo nel costruttore: 
class MockA: public A {
public:
    virtual ~MockA() {}
    MOCK_METHOD0(doThings, void());
};
TEST(...) {
    auto ma = std::make_unique<MockA>();
    B b(std::move(ma));
    // Set expectation on mock
    // call B method
}
Il problema è questo:
-  il mock è stato spostato all'interno dell'istanza   
Be quindi la verifica delle aspettative genera un'eccezione perchémaè nullo. 
 Il mio primo tentativo di risolverlo è stato quello di modificare   B    come segue: 
class B {
private:
    B(std::unique_ptr<A>& a): a_(a) {}
    std::unique_ptr<A>& a_;
};
 Ora   B    gestisce il puntatore univoco  riferimenti  e non usa   std::move   . Anche il test è cambiato (non più uso di   std::move   ): 
TEST(...) {
    auto ma = std::make_unique<MockA>();
    B b(ma);
    // Set expectation on mock
    // call B method
}
 Ora il codice non viene compilato perché i riferimenti (se ho capito correttamente l'errore) non sono polimorfici (il puntatore univoco di   MockA    non può essere convertito nel puntatore univoco di   A   ). 
Mi mancano alcune nozioni di base sui puntatori intelligenti? O è questo il comportamento previsto con i puntatori unici e quindi devo ripensare alle mie classi (magari usando i puntatori condivisi)?