template<class T> class Passkey { friend T; Passkey() = default; // note that this ctor is private! }; class A; class B; class C { friend A; private: void internal(); public: void intentionalA(Passkey<A>); void intentionalB(Passkey<B>); }; class A { void m(C& c) { c.internal(); // OK c.intentionalA({}); // OK c.intentionalB({}); // Error, Passkey<B>'s constructor is inaccessible } }; class B { void m(C& c) { c.intentionalB({}); // OK } };