>>31
DがCを変更しないなら、const修飾子を付けることは出来る。
class D {
const C& _c;
public: D(const C& c) : _c(c) {}
};

CがDに変更されうり、かつ、Cは一度Dを生成したら二度と使われないのであれば、move semanticsを使うことも出来る
class D {
C _c;
public: D(C&& c) : _c(std::move(c)) {}
};

CがDに変更されうる上にCが複数のDを生成するのであれば、CをDのfriendに指定して、Dのprivate constructorをCから呼ぶ事で解決できる
class D;
class C {
std::shared_ptr<C> self;
public:
C() : self(std::shared_ptr<C>(this)) { return; }
D* make_D();
};
class D {
friend C; std::shared_ptr<C> _c;
explicit D(const std::shared_ptr<C>& c) : _c(c) { return; }
};
D* C::make_D() { return new D(self); }

後なんかあったっけ?