template<class... T> class Passkey { friend T...; Passkey() {} }; class A; class B; class C { friend A; private: void internal(); public: void intentional(Passkey<A, B>); }; class A { void m(C& c) { c.internal(); // OK c.intentional({}); // OK } }; class B { void m(C& c) { c.intentional({}); // OK } };