The book is quite old and c++ code there is dated, nobody writes like that anymore. But the concepts and approaches are timeless. So many times I saw code that should be refactored according to the patterns presented in the book. The book really is a good source of inspiration on how and why the code should be written differently. Modern software libraries and products are inherently complex and good architecture is a must to make them reusable and scalable. Among the cons I would highlight the dated c++ code, but overall I think c++ is not the best language to present patterns. The book is rather dry on theory, hence the reader has to be prepared to consume dry technical material. Another quite sad disadvantage is that the book doesn't introduce a reader to GRASP patterns (General Responsibility Assignment Software Patterns), which is a list of guidances. GoF (GoF is gang of four and GoF patterns are the patterns presented in the book) patterns have much more sense if one thinks of them in terms of GRASP.
As a good companion book, I would recommend "Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development" by Craig Larman. Larman's book gives a more gentle introduction to some of GoF patterns, explains why they are useful via GRASP guidelines and presents patterns via UML (and c# code if you like code more than diagrams) which is, in my view, much more accessible for developers who do not write code in c++. I agree that UML is outdated, but it gives a reader a good opportunity to grasp the ideas without constraints of a particular language. So two books work great together to introduce a reader to the world of good software engineering practices.
btw I recently (summer 2019) had several interviews in big tech companies in silicon valley and in 2 of them I was told that this book is a very much recommended reading for every software engineer.