Compiler improvements in VS 2015 Update 3

The C++ compiler team is excited for you to try out the compiler in Visual Studio 2015 Update 3. We’ve made significant progress towards C++ standards conformance between the first release of Visual Studio 2015 and VS 2015 Update 3. Update 3 also has improvements in expression SFINAE, nested namespaces, and generalized range-based for loops. Lastly, we’ve got a new set of switches that help you to control the version of the ISO C++ programming language you depend upon in your code.

We’ve also fixed almost 200 compiler bugs since Update 2, many of which came from your reports on Connect. Thank you! We know that the occasional bug fixes can prompt source code changes to be more standards conformant. When source changes are needed, the compiler will provide well-defined diagnostic messages and we’ll continue to document each fix and its impact on this page: compiler conformance improvements documentation for VS 2015. Know that we’ll continue to keep an extremely high for bug fixes that require source code changes.

Let’s dive into some of the feature improvements we’ve made in the compiler for VS 2015 Update 3. Many of these changes are helping our compiler to conform to existing C++11 and C++14 Standards features. And some of our changes are forward-looking; that is, we implemented features expected to be in the next version of C++.

    • Standards versioning: In Visual C++ 2015 Update 3 we are introducing tools to help you control the version of the ISO C++ programming language you depend on and the version you want VC++ to enforce in your projects. We’re creating a series of new switches that correspond to versions of the C++ language, starting with /std:c++14 and /std:c++latest. Read more in this blog post: Standards version switches in the compiler.
    • Expression SFINAE: We’ve been working hard on improving our Expression SFINAE support, especially for popular libraries such as Boost and Range-v3. Read more about it in this blog post: Expression SFINAE improvements in VS 2015 Update 3
    • Nested namespaces: The next version of C++ includes a more concise way to define nested namespaces. Instead of typing
      	
          namespace A { 
              namespace B { 
                  namespace C { 
                  ... 
                  }  
              } 
          }
      

      you can write

      namespace A::B::C { 
          ... 
      }
      

      Visual C++ supports the more concise syntax in Update 3. This feature is expected in the next version of C++ but it’s supported in Update 3 today under the /std:c++latest switch (see Standards Versioning, above.) You can read more about the feature in the proposal: Nested namespace definition.

    • Generalized range-based for loops: Generalized range-based for loops no longer require the <begin> and <end> iterators to have the same type. This feature is expected in the next version of C++ but it’s supported in Update 3 today under the /std:c++latest switch (see Standards Versioning, above.) You can read more about the feature in the proposal: Generalizing the Range-Based For Loop.

In closing

As always, we’re eager for you to try out the changes and give us feedback in the comments below, by email at visualcpp@microsoft.com, or through any of the usual channels: User Voice, Suggestions, Connect (for bugs), or even Send-A-Smile. We love hearing from you!

Update 8 Jun ’16: Folks have been asking whether the new optimizer shipped in Update 3. It is part of VS 2015 Update 3.