https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64615
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- The standard is clear that D::D(int) is protected: "Base-class constructors considered because of a using-declarator are accessible if they would be accessible when used to construct an object of the base class; the accessibility of the using-declaration is ignored." So G++ is correct to give an error on that line. I'm not sure why D::D() is public though. It seems that it isn't inherited from B::B() but is implicitly defined by the compiler (and then calls B::B() but it's OK for D's constructor to call the protected constructor of its base class).