Two-phase name lookup support comes to MSVC (C++ team blog)
“Two-phase name lookup” is an informal term that refers to a set of rules governing the resolution of names used in a template declaration. These rules were formalized more than two decades ago in an attempt to reconcile two opposing compilation models for templates: the inclusion model (what most developers know of templates today), and the separation model (the basis of the original design for templates). You can find the genesis of dependent names in the foundational paper Proposed Revisions to the Template Specification, firmly grounded in the One Definition Rule principle. If you’re interested in diving into the glorious details, you can find these rules in modern terms in section 17.6 (stable name [temp.res]) of the C++17 draft standard. In the last few months the MSVC compiler has come from having no support for two-phase name lookup to being usable on most code. We’ll finish complete support for this feature in a future Visual Studio 2017 update.