The post What’s New in vcpkg (September 2025) appeared first on C++ Team Blog.
]]>x-azcopy
and x-azcopy-sas
, support for tvOS and watchOS target platforms, and minor improvements and bug fixes.
Some stats for this period:
x-azcopy-sas,<url>,<sas>[,<rw>]
: Intended as a drop-in replacement for azblob, it uses SAS tokens for authentication.x-azcopy,<url>[,<rw>]
: Intended for non-SAS authentication methods like Microsoft Entra ID; requires preloading credentials and/or the AZCOPY_AUTO_LOGIN_TYPE
.azcopy copy --from-to BlobLocal {destination} --include-path {files}
argument to download multiple files in a single azcopy job. This improves performance and brings it more in line with azblob, that uses a single curl invocation to download a batch of files. Upload happens one file at a time in the background.--dereference-symlinks
to vcpkg export
. This copies symlinks as regular files and directories in the exported results, which can be useful to continuous integration systems needing to restore vcpkg’s install tree (PR: Microsoft/vcpkg-tool#1705).configuration
. This is an alias for the vcpkg-configuration
property, allowing you to embed vcpkg configuration properties that would otherwise have been specified in a separate vcpkg-configuration.json file (PR: Microsoft/vcpkg-tool#1766).configuration
field in vcpkg.json files. (PR: Microsoft/vcpkg-docs#527).--dereference-symlinks
option for vcpkg export (PR: Microsoft/vcpkg-docs#524).x-azcopy
and x-azcopy-sas
binary caching sources (PR: Microsoft/vcpkg-docs#511).If you have any suggestions for our documentation, please submit an issue in our GitHub repo or see the box at the bottom of a particular article.
triplet | ports available |
x86-windows | 2463 |
x64-windows | 2586 |
x64-windows-release | 2587 |
x64-windows-static | 2457 |
x64-windows-static-md | 2514 |
x64-uwp | 1458 |
arm64-windows | 2189 |
arm64-windows-static-md | 2171 |
arm64-uwp | 1422 |
x64-osx | 2416 |
arm64-osx | 2385 |
x64-linux | 2577 |
arm-neon-android | 2011 |
x64-android | 2071 |
arm64-android | 2035 |
While vcpkg supports a much larger variety of target platforms and architectures (as community triplets), the list above is validated exhaustively to ensure updated ports don’t break other ports in the catalog.
vcpkg couldn’t be where it is today without contributions from our open-source community. Thank you for your continued support! The following people contributed to the vcpkg, vcpkg-tool, or vcpkg-docs repos in this release (listed by commit author or GitHub username):
Adam Glustein | Connector Switch | maredman | talregev |
Adam Johnson | CQ_Undefine | Markus Vieth | tartanpaint |
Adeel Kazmi | Dr. Patrick Urbanke | miyanyan | Thomas1664 |
Adrien Bourdeaux | Dzmitry Baryshau | Nick D’Ademo | Tiago Freitas |
Albert Lee | Egor Tyuvaev | Nick Logozzo | toge |
albertony | Emre | Oleg Derevenetz | Tom Conder |
Alexander Smyslov | Eric Kilmer | PARK DongHa | Victor Romero |
Alexis La Goutte | Erica | pastdue | Vitalii Koshura |
Alexis Placet | Ethan J. Musser | Peter Hull | Vladimir Petrigo |
Alstruit | evelance | Rémy Tassoux | Vpatakottu |
autoantwort | Francisco Facioni | Robin WILS | Waldemar Kornewald |
Bas M. | Jaap Aarts | RPeschke | Weihang Ding |
Byoungchan Lee | Jonathan Sweemer | Saikari | Zackery |
Cadons | Kai Pastor | SunBlack | 曹梦轩 |
Chuck Walbourn | Kyle Benesch | Takatoshi Kondo |
You can find the main release notes on GitHub. Recent updates to the vcpkg tool can be viewed on the vcpkg-tool Releases page. To contribute to vcpkg documentation, visit the vcpkg-docs repo. If you’re new to vcpkg or curious about how a package manager can make your life easier as a C/C++ developer, check out the vcpkg website – vcpkg.io.
If you would like to contribute to vcpkg and its library catalog, or want to give us feedback on anything, check out our GitHub repo. Please report bugs or request updates to ports in our issue tracker or join more general discussion in our discussion forum.
The post What’s New in vcpkg (September 2025) appeared first on C++ Team Blog.
]]>The post Fixing Overload Resolution For Parameter Arrays in C++/CLI appeared first on C++ Team Blog.
]]>In the below discussion, .NET Framework
refers to the older version of the Microsoft Common Language Runtime, also known as “Desktop Framework” (versions 4.0 through 4.8.x) while .NET
refers to versions .NET Core 3.1
, .NET 5
and later.
The overload resolution behavior specified by the C++/CLI ECMA-372 Standard for overloads involving parameter arrays results in surprising behavior in some instances. This problem has manifested with recent versions of .NET, which added parameter array overloads to some commonly used classes, resulting in overload resolution which is surprising, even counterintuitive, and results in broken customer code when it is ported from .NET Framework to .NET. This article explains the problem and the solution adopted by the MSVC compiler to solve it.
ECMA-372 section 14.6 details the rules governing overload resolution where parameter arrays are involved. The method to resolve overloads is that for a given parameter-array overload such as
void f(T1 arg1, T2 arg2, <...>, Tm argm, ...array<T>^ arr);
and a corresponding call
f(var1, var2, <...>, varm, val1, val2, <...>, valn);
a new function overload is synthesized, where the parameter array arr
is replaced with parameters corresponding to the types of the formal
arguments val1, val2 ... valn
. Then, overload resolution is performed
as usual with the additional requirement that such synthesized overloads
have lower cost than a C-style variadic function (i.e., those using
...
as the last argument) but higher cost than non-synthesized
overloads. This requirement is in fact the cause of surprising behavior
described below.
In .NET Framework, the String
class has these methods (type names
are from namespace System
):
Split(...array<Char>^); // 1 (parameter array overload)
// other Split overloads not of interest
Given a function call such as:
str->Split(L'a', L'b'); // 2
the Split
overload (2) with the parameter array argument is the only
one that matches. When this same code is compiled against .NET, a
customer found that a different overload is instead chosen. The reason
is subtle, surprising and a combination of questionable overload
resolution rules in ECMA-372 and changes to the String
class in .NET.
The difference between .NET Framework’s version of String
and .NET’s version is that .NET added an additional overload, leading
to this set of overloads:
Split(Char, Int32, StringSplitOptions = StringSplitOptions::None); // 3
Split(...array<Char>^); // 4
Now faced with the same function call (2) above, we see that both
overloads are viable because C++ has an implicit Char
(aka wchar_t
) to
Int32
(aka int
) conversion, and the third parameter of (3) has a default
argument. Due to the rule in ECMA-372/14.6, the parameter array overload
(4) is deemed to have a higher cost and overload (3) is chosen, even
though the arguments match the parameters exactly for overload (4).
This is clearly not what the user wanted.
After discussion in the team, we noticed that there is a telling comment in ECMA-372/14.6 regarding preferring non-synthesized to synthesized overloads:
“[Note: This is similar to the tiebreaker rules for template functions and non-template functions in the C++ Standard (§13.3.3). end note]”
While the tie-breaking rule in ISO C++ does indeed exist, it comes into play only after overload resolution is done and the choice is between two overloads, one a generated function and one a non-template function. It looked like the ECMA-372 rule for choosing non-synthesized over synthesized was poorly formulated as it assigned the latter a higher cost regardless of the costs of the conversion sequences of the arguments.
In ISO C++, an analogous example would be:
template<typename T>
void Split(T, T); // 5
void Split(wchar_t, int); // 6
The function call Split(L’a’, L’b’)
will resolve to overload (5) since
the arguments match exactly while one of the arguments of (6) requires a
standard integral conversion. Hence, there is no need to use the
tie-breaking rule at all. Were both formal arguments of (6) of type wchar_t
, the
tie-breaking rule would indeed come into play and choose (6) instead of
giving an ambiguity error.
It became clear that ECMA-372/14.6 should have said if there is an ambiguity between two remaining overloads, one a synthesized parameter array overload, and one a non-synthesized overload, overload resolution would choose the non-synthesized one. We decided to implement this updated interpretation but there was a problem: what to do about the code currently compiling and working correctly with the older rules?
The risk of breaking older code was too great if we went unconditionally with the new rules, so we added two mechanisms to control this behavior at the compilation unit level, and whenever needed, at the function-call level.
First, we introduced new driver switches:
/clr:ECMAParamArray |
Turn on ECMA-372 conformant parameter array behavior |
/clr:ECMAParamArray- |
Use updated semantics for parameter arrays |
In addition, the below existing driver switches were changed to imply these corresponding modes:
/clr |
implies /clr:ECMAParamArray |
/clr:netcore |
implies /clr:ECMAParamArray- |
In plain language, for compilations targeting .NET Framework, we maintain the old behavior, while for compilations targeting .NET, the new behavior is the default.
To allow fine-grained control over the parameter array overload
resolution mode at the function-call level, we provide a new pragma,
ecma_paramarray
, which can be used thus:
#pragma ecma_paramarray(push, on)
// Normally calls Split(Char, int32, StringSplitOptions = None) and
// not Split(...array<Char>^) under /clr:netcore but this is
// reverted back to the old behavior under the pragma.
auto r = s->Split(L'a', L'b');
#pragma ecma_paramarray(pop)
This pragma overrides any ambient mode for handling parameter array overload resolution, whether it comes from a prior pragma use or from the translation unit’s ambient mode.
To warn about changed behavior in overload resolution, a new warning
C5306
has been implemented. Consider compiling the below under /clr:netcore
:
int main()
{
System::String^ s = "Now is the time+for all good men|to come to the aid of the party";
auto strings = s->Split(L'|', L'+'); // Split(params char[]), not Split(char, int, System.StringSplitOptions = 0)
}
This produces the diagnostic:
auto strings = s->Split(L'|', L'+'); // Split(params char[]), not Split(char, int, System.StringSplitOptions = 0)
^
w.cpp(4,23): warning C5306: parameter array behavior change: overload 'System::String::Split' resolved to 'array<System::String ^> ^System::String::Split(...array<wchar_t> ^)'; previously, it would have resolved to 'array<System::String ^> ^System::String::Split(wchar_t,int,System::StringSplitOptions)'. Use /clr:ECMAParamArray to revert to old behavior
In addition, missing the L
prefix for arguments can also produce
surprising results in overload resolution with the new parameter array
overload rules. A new warning C5307
was implemented to warn about
this:
int main()
{
System::String^ s = "abc def\tghi";
// Resolves to Split(System.Char, System.Int32, System.StringSplitOptions = 0) but should warn with C5307
auto arrs = s->Split(' ', '\t'); // Should be Split(L' ', L'\t').
}
produces
auto arrs = s->Split(' ', '\t'); // Should be Split(L' ', L'\t').
^
w.cpp(4,20): warning C5307: 'array<System::String ^> ^System::String::Split(wchar_t,int,System::StringSplitOptions)':
argument (2) converted from 'char' to 'int'. Missing 'L' encoding-prefix for character literal?
We would be happy to hear back from you if you have encountered problems in this area and how you solved them, and if the new way of handling parameter array overloads has helped you or hindered you.
The post Fixing Overload Resolution For Parameter Arrays in C++/CLI appeared first on C++ Team Blog.
]]>The post Microsoft C++ Team at CppCon 2025 appeared first on C++ Team Blog.
]]>It’s that time of year again! We are excited to see you all at CppCon this year, where we’ll once again be delivering a variety of presentations, from the latest advancements in debugging technology to extensibility frameworks for AI agents. See the end of this post for a listing of all of the sessions involving Microsoft staff. And yes, there’ll be plenty of information on the freshly announced Visual Studio 2026.
We’ll also have a booth through the first four days of the conference. Come on by and let us know what matters to you or ask any burning questions you may have regarding C++ at Microsoft. We will be well stocked with our most popular swag, so come on by and have a chat with us. There may even be appearances by speakers in case you didn’t get a chance to ask that all important question after their session.
Our annual survey is now open and will be available all week throughout the conference. It’s super lightweight, and upon completion, CppCon attendees will be entered into a raffle for one of four great prizes. You do have to be onsite for the daily drawing to win (see official rules here), but even if you aren’t going to be at the conference, you can still complete the survey to let us know what you think of our C++ products. New this year on the survey is an option to select a dedicated time to talk with Microsoft staff about the topics you care about. So, if you don’t want to lose your voice in a crowded expo hall you can find that right time that fits into your busy schedule.
Visual Studio 2026 and MSVC Build Tools v14.50 Preview are already available on the Insiders Channel (which replaces the previous Visual Studio 2022 Preview channel), with a Stable Channel going live later in 2025. We want to hear from you at CppCon about your experiences with Visual Studio 2026 Insiders, so give it a spin and come chat with us about your experiences.
The post Microsoft C++ Team at CppCon 2025 appeared first on C++ Team Blog.
]]>The post C++ Language Updates in MSVC Build Tools v14.50 appeared first on C++ Team Blog.
]]>It has been some time since we have provided an update on MSVC progress, and this one comes with the latest major update to our IDE: Visual Studio 2026 version 18.0. This version of Visual Studio ships with the MSVC Build Tools version 14.50, which includes version 19.50 of the MSVC compiler. You can try out the improvements by downloading the Insiders release. Also, if you want to track updates in the Standard Library, check out the STL Changelog, which is regularly updated. Let’s jump right into the updates!
As C++ standards progress in MSVC, you can follow along using the cppreference compiler support table and help us identify what we should be working on next!
// Prior to P0849R8:
void pop_front_alike(auto& x) {
using T = std::decay_t<decltype(x.front())>;
std::erase(x, T(x.front()));
}
// After P0849R8:
void pop_front_alike(auto& x) {
std::erase(x, auto(x.front()));
}
#warning
// Valid prior to C++23.
#error bad configuration...
// Valid after C++23.
#warning configuration deprecated...
struct S {
S& operator=(this S&, const S&) = default; // Valid after CWG2586.
auto operator<=>(this const S&, const S&) = default; // Valid after CWG2586.
};
template <typename T, size_t N>
constexpr size_t array_size(T (&)[N]) {
return N;
}
void check(int const (¶m)[3]) {
constexpr auto s2 = array_size(param); // Previously ill-formed, now accepted as a constant expression after P2280R4.
}
constexpr
consteval
functions in an if consteval
would sometimes produce a compiler error.
#pragma warning(disable:...)
when the pragma appeared in a module or header unit.
if constexpr
with empty condition.
decltype
would sometimes return the wrong type when used with ternary expressions.
typeof
As always, we welcome your feedback. Feel free to send any comments through e-mail at visualcpp@microsoft.com, through Twitter @visualc, or through BlueSky @msftcpp.bsky.social. Also, feel free to follow Cameron DaCamara on Twitter @starfreakclone.
If you encounter other problems with MSVC in Visual Studio 2026 please let us know via the Report a Problem option, either from the installer or the Visual Studio IDE itself. For suggestions or bug reports, let us know through Developer Community.
The post C++ Language Updates in MSVC Build Tools v14.50 appeared first on C++ Team Blog.
]]>The post Visual Studio 2026 Insiders is here! appeared first on C++ Team Blog.
]]>Visual Studio 2026 features a fresh UI, faster performance, and improved developer productivity with advanced AI integration.
For more details on what’s new, check out the official announcement on the Visual Studio Blog!
We would love your feedback – try out our Insiders release of Visual Studio 2026 today! If you run into any issues, you can report them to Visual Studio Developer Community from the IDE by navigating to Help > Send Feedback > Report a Problem.
The post Visual Studio 2026 Insiders is here! appeared first on C++ Team Blog.
]]>The post What’s New in vcpkg (August 2025) appeared first on C++ Team Blog.
]]>Some stats for this period:
Earlier this month, we announced GitHub Dependabot support for vcpkg. This allows GitHub users to receive automated PRs to upgrade their vcpkg versioning baselines. Since that announcement, the automated PRs have been updated to include information about the vcpkg release being upgraded to, including port counts per triplet, as well as a list of impacted ports and their original vs. new versions. Here is an example of one of the new PRs.
No tool updates as of 2025.08.27. More tool updates will be included in next month’s release.
If you have any suggestions for our documentation, please submit an issue in our GitHub repo or see the box at the bottom of a particular article.
triplet | ports available |
x86-windows | 2453 |
x64-windows | 2575 |
x64-windows-release | 2575 |
x64-windows-static | 2450 |
x64-windows-static-md | 2507 |
x64-uwp | 1452 |
arm64-windows | 2181 |
arm64-windows-static-md | 2163 |
arm64-uwp | 1421 |
x64-osx | 2446 |
arm64-osx | 2376 |
x64-linux | 2568 |
arm-neon-android | 1998 |
x64-android | 2059 |
arm64-android | 2021 |
While vcpkg supports a much larger variety of target platforms and architectures (as community triplets), the list above is validated exhaustively to ensure updated ports don’t break other ports in the catalog.
vcpkg couldn’t be where it is today without contributions from our open-source community. Thank you for your continued support! The following people contributed to the vcpkg, vcpkg-tool, or vcpkg-docs repos in this release (listed by commit author or GitHub username):
A13501350 | Egor Tyuvaev | KRM7 | Saikari |
acidx27x | Ethan J. Musser | Lars Fröhlich | Silvio Traversaro |
Adrian Bibby Walther | EvilMcStevil | Matt | Stephen G Tuggy |
albertony | Fabien Péan | Matthias Kuhn | Stephen Webb |
Alexander Neumann | hambaga | Maxime Gervais | Steve Brain |
Alexander Vieth | HanByul Yang | Michał Petryka | SunBlack |
Alexandre Petitjean | Hartmut Kaiser | Mikael Lindemann | Takatoshi Kondo |
Alexis La Goutte | Hlongyu | miyanyan | talregev |
Andrew Kaster | Hossein Moein | myd7349 | Theodore Tsirpanis |
Andrew Tribick | JacobBarthelmeh | Mys Vac | Thomas1664 |
ayeteadoe | James Robertson | Mzying2001 | Tim Flynn |
Benjamin Gilbert | Jean Felder | Nick D’Ademo | toge |
Benoît Hauquier | Jeremy Rifkin | Nick Logozzo | Tolker-KU |
Branden Bonaby | JoergAtGithub | pastdue | Vitalii Koshura |
Bryce Mecum | John Wason | Pierre | Waldemar Kornewald |
Charles Karney | Johnny Willemsen | Pierre Wendling | Weihang Ding |
Chuck Walbourn | Jonathan Hyry | PolarGoose | xavier2k6 |
CQ_Undefine | Jonathan Sweemer | ptahmose | Yury Bura |
Crindzebra Sjimo | jreichel-nvidia | Rafael Kitover | Zackery |
cuihairu | Kai Blaschke | Raul Metsma | Zhang |
Dimitar Krastev | Kai Jia | RippeR37 | |
Dr. Patrick Urbanke | Kai Pastor | Saad |
You can find the main release notes on GitHub. Recent updates to the vcpkg tool can be viewed on the vcpkg-tool Releases page. To contribute to vcpkg documentation, visit the vcpkg-docs repo. If you’re new to vcpkg or curious about how a package manager can make your life easier as a C/C++ developer, check out the vcpkg website – vcpkg.io.
If you would like to contribute to vcpkg and its library catalog, or want to give us feedback on anything, check out our GitHub repo. Please report bugs or request updates to ports in our issue tracker or join more general discussion in our discussion forum.
The post What’s New in vcpkg (August 2025) appeared first on C++ Team Blog.
]]>The post Announcing Proxy 4: The Next Leap in C++ Polymorphism appeared first on C++ Team Blog.
]]>A special thank you to @SidneyCogdill for his outstanding contributions, especially for bringing support for C++20 modules to Proxy and driving major‑version compatibility efforts. His work has made the library even more accessible and future‑proof.
Proxy is a header-only, cross-platform C++20 library that lets you write polymorphic code without the pain of inheritance or the limitations of traditional virtual functions. Proxy enables you to:
If you’re new to Proxy, check out our GitHub repository and our previous announcements: Announcing the Proxy 3 Library for Dynamic Polymorphism and Analyzing the Performance of the “Proxy” Library.
We’ve launched a new documentation website, built with MkDocs, to help you find everything you need about Proxy. The new site offers improved navigation, a unified FAQ, and a clear structure for all features and APIs. Explore the documentation and discover how easy it is to get started!
You can now experiment with Proxy directly in your browser using Compiler Explorer! Write, run, and inspect Proxy code without any setup. Just click on “Libraries” and search for “proxy” in Compiler Explorer or use a shared link from our examples to get started. It’s a great way to see Proxy in action and share your findings with others.
Let’s see how easy it is to add formatting support to your types (run in Compiler Explorer):
#include <format>
#include <proxy/proxy.h>
struct Formattable : pro::facade_builder
::add_skill<pro::skills::format>
::build {};
int main() {
pro::proxy<Formattable> p = pro::make_proxy<Formattable>(123);
std::cout << std::format("{}\n", *p); // Prints "123"
}
Skills are reusable building blocks that let you add powerful capabilities to your facades with a single line:
skills::format
and skills::wformat
: Enable standard C++ formatting for your proxies. This was never possible with virtual functions or earlier Proxy versions.skills::fmt_format
and skills::fmt_wformat
: Bring full {fmt} library support to your proxies, letting you use advanced formatting features with zero boilerplate.skills::rtti
: Add runtime type information and safe casting to your proxies.skills::as_view
and skills::as_weak
: Allow seamless conversion to non-owning or weak proxies, making your code safer and more expressive.skills::slim
: Restrict your proxy to pointer-sized storage for maximum efficiency.Skills are easy to compose and extend. You can also author internal, domain‑specific skills to capture patterns (logging, metrics hooks, validation, instrumentation) so teams reuse a single, well-reviewed definition instead of duplicating conventions. This improves consistency and long‑term maintainability. See the skills documentation for more.
Proxy 4 introduces convenient aliases for non-owning and weak references: proxy_view
and weak_proxy
. These are built on top of the core proxy
concept, making it easier to express borrowing and weak ownership patterns in your code. For example, you can use proxy_view
to safely borrow an object without taking ownership, or weak_proxy
to create a weak reference that can be locked when needed. See the proxy_view
documentation and weak_proxy
documentation for details.
With the new make_proxy_shared
and allocate_proxy_shared
APIs, you can create shared and weak proxies efficiently, without the overhead of std::shared_ptr
. These APIs use compact internal pointer types, ensuring high performance and low memory usage. Learn more in the make_proxy_shared
documentation and allocate_proxy_shared
documentation.
weak_dispatch
lets you define fallback behavior for missing conventions, so your code can handle incomplete types gracefully.explicit_conversion_dispatch
, implicit_conversion_dispatch
) are now easier to use and provide clearer error messages.proxiable_target
and inplace_proxiable_target
concepts make it clear which target types can be used with a given facade, helping you avoid surprises and write safer code.Proxy 4 introduces facade_aware_overload_t
, which lets you define recursive conventions that refer to the facade itself without forcing early instantiation. This is especially useful for operator chaining patterns (like arithmetic or concatenation) that return new proxy
objects of the same facade. Example:
#include <format>
#include <iostream>
#include <proxy/proxy.h>
template <class F>
using BinaryOverload =
pro::proxy<F>(const pro::proxy_indirect_accessor<F>& rhs) const;
template <class T, pro::facade F>
pro::proxy<F> operator+(const T& value,
const pro::proxy_indirect_accessor<F>& rhs)
requires(!std::is_same_v<T, pro::proxy_indirect_accessor<F>>)
{
return pro::make_proxy<F, T>(value + proxy_cast<const T&>(rhs));
}
struct Addable
: pro::facade_builder // Compose capabilities
::add_skill<pro::skills::rtti> // RTTI support
::add_skill<pro::skills::format> // Formatting support
::add_convention<pro::operator_dispatch<"+">,
pro::facade_aware_overload_t<BinaryOverload>> // Recursive operator
::build {};
int main() {
pro::proxy<Addable> p1 = pro::make_proxy<Addable>(1);
pro::proxy<Addable> p2 = pro::make_proxy<Addable>(2);
pro::proxy<Addable> p3 = *p1 + *p2; // Uses facade-aware overload
std::cout << std::format("{}\n", *p3); // Prints "3"
}
See the facade_aware_overload_t
documentation for details.
memcpy
, enabling faster moves and assignments by default. This means better performance and less boilerplate for you. See the is_bitwise_trivially_relocatable
documentation for more details..ixx
files for blazing-fast builds and better IDE support.Upgrading a small component is usually straightforward, but migrating a monorepo or multi-module product can be challenging. Follow the guidelines below:
pro::v3
, pro::v4
, …). When a translation unit sees multiple majors, qualify the namespace explicitly:
pro::v3::foo(); // Proxy 3 API
pro::v4::foo(); // Proxy 4 API
The newest release re-exports its namespace as the inline (default) namespace, so unqualified calls (pro::foo()
) resolve to the latest version once the migration is complete.
PRO4_DEF_MEM_DISPATCH
. Use these forms whenever headers from multiple majors are included in the same translation unit.These rules let old and new code coexist during the transition while keeping ODR violations at bay.
PRO_DEF_WEAK_DISPATCH
has been removed in favor of the more flexible weak_dispatch
class.proxiable_ptr_constraints
has been merged into the ProFacade requirements for simplicity.access_proxy
is now shadowed by proxy_invoke
and proxy_reflect
.Proxy 4 builds on a mature foundation introduced and proven in Proxy 3, and adds focused refinements rather than reinventing the model.
Core capabilities (established in Proxy 3 and still central in day‑to‑day use):
make_proxy
(inline where possible), allocate_proxy
(custom allocators), raw pointer attachment, unique ownership, and composition of abstractions via add_convention
/ add_reflection
/ add_facade
.proxy
type: same facade supports non‑owning, unique, inline, or externally managed objects transparently.Targeted Proxy 4 refinements:
proxy_view
, weak_proxy
) built atop the existing core.make_proxy_shared
, allocate_proxy_shared
) complement (not replace) the more frequently used make_proxy
/ allocate_proxy
paths.proxiable_target
, inplace_proxiable_target
) clarify when a type can be used with make_proxy
versus make_proxy_inplace
, giving earlier, sharper diagnostics instead of template noise.facade_aware_overload_t
enables recursive facade/operator definitions (e.g. arithmetic that returns the same facade) without forcing premature instantiation.weak_dispatch
for graceful fallback when some contained types omit a convention.is_bitwise_trivially_relocatable
), module support, and leaner code generation.Questions and feedback are welcome! If you find something unclear, a bug, or a documentation gap, feel free to open an issue or submit a PR.
The post Announcing Proxy 4: The Next Leap in C++ Polymorphism appeared first on C++ Team Blog.
]]>The post Dependabot support for vcpkg appeared first on C++ Team Blog.
]]>For C++ developers managing dependencies through vcpkg, this integration eliminates a critical gap in the DevSecOps pipeline. Dependabot will automatically scan your vcpkg.json
manifests, monitor for updates, and create pull requests when new versions become available. This matches the automation capabilities enjoyed by other language ecosystems like JavaScript and Python.
Unlike most package managers, vcpkg uses a “baseline” system that’s particularly well-suited to C++’s complexity. Instead of updating individual packages piecemeal, Dependabot advances your entire baseline to a newer snapshot where all libraries have been tested together.
Think of it this way: rather than updating curl and leaving OpenSSL at an older version, which might cause compatibility issues, the baseline update moves you to a curated set where curl, OpenSSL, and all your other dependencies are known to work together. This approach prevents the ABI (Application Binary Interface) incompatibilities and version conflicts that plague C++ projects when libraries compiled with different settings try to interact.
A single change updates all unpinned dependencies to versions that vcpkg maintainers have verified work together. You can still pin specific libraries using version>=
constraints or overrides when needed. See vcpkg’s versioning documentation for more details.
Setting up Dependabot for vcpkg follows the same pattern as other supported ecosystems. Add the following configuration to your .github/dependabot.yml
file:
version: 2
updates:
- package-ecosystem: "vcpkg"
directory: "/" # The location of your vcpkg.json
schedule:
interval: "weekly"
The configuration supports all standard Dependabot options, including custom schedules, cooldown periods, and custom commit messages.
For a practical demonstration, check out this example repository that showcases Dependabot updating vcpkg dependencies. The repository includes a vcpkg.json
manifest with a builtin-baseline
field that Dependabot automatically updates to the latest vcpkg port repository commit. You can examine the pull requests to see what Dependabot does when updates are available.
The integration brings modern dependency management practices to C++ development, ensuring libraries stay current with minimal manual effort. Regular dependency updates prevent the accumulation of technical debt that occurs when libraries fall behind multiple major versions. With Dependabot handling the routine work of checking for updates, developers can focus on feature development while maintaining a healthy dependency tree.
Automated dependency management reduces maintenance overhead and helps prevent security issues from outdated packages. By implementing Dependabot for vcpkg, you can maintain current dependencies without dedicating significant manual effort to the task.
Take the first step today: add the Dependabot configuration file to your repository and let automated dependency management transform how your team handles C++ package updates.
The post Dependabot support for vcpkg appeared first on C++ Team Blog.
]]>The post What’s New in vcpkg (July 2025) appeared first on C++ Team Blog.
]]>Some stats for this period:
The following notable changes were made in this release:
vcpkg install <port names>
(PR: Microsoft/vcpkg-tool#1514).If you have any suggestions for our documentation, please submit an issue in our GitHub repo or see the box at the bottom of a particular article.
triplet | ports available |
x86-windows | 2442 |
x64-windows | 2564 |
x64-windows-release | 2564 |
x64-windows-static | 2437 |
x64-windows-static-md | 2494 |
x64-uwp | 1439 |
arm64-windows | 2157 |
arm64-windows-static-md | 2138 |
arm64-uwp | 1406 |
x64-osx | 2433 |
arm64-osx | 2359 |
x64-linux | 2551 |
arm-neon-android | 1980 |
x64-android | 2041 |
arm64-android | 2003 |
While vcpkg supports a much larger variety of target platforms and architectures (as community triplets), the list above is validated exhaustively to ensure updated ports don’t break other ports in the catalog.
vcpkg couldn’t be where it is today without contributions from our open-source community. Thank you for your continued support! The following people contributed to the vcpkg, vcpkg-tool, or vcpkg-docs repos in this release (listed by commit author or GitHub username):
Aditya Rao | Craig Edwards | Kai Blaschke | Russell Greene |
Albert Lee | Dewey Dunnington | Kai Pastor | S. M. Mohiuddin Khan Shiam |
Aleksi Sapon | dg0yt | llm96 | Saad |
Alex Emirov | Dr. Patrick Urbanke | Loïc Bartoletti | Saikari |
Alexis La Goutte | Egor Krugletsov | Luca Longinotti | Samuel Marks |
Alexis Placet | Employee_NO427 | Lukas Dürrenberger | Sander Cox |
Ali Mohammad Pur | Ethrynto | Lukey | shixiong2333 |
Alonso Schaich | Fidel Yin | matlabbe | sidy3d |
Amin Ya | Filippos Karapetis | Matthias Zronek | Stefano Sinigardi |
An Tao | gav2xlin | Michał Petryka | Stephen Eckels |
Anders Wind | GioGio | Michael MIGLIORE | SunBlack |
Andrew Kaster | Igor Pugachev | miyanyan | Sylvain Doremus |
Antony Peacock | ilya-fedin | Mzying2001 | Taewon Park |
autoantwort | Ivan | Nick D’Ademo | Takatoshi Kondo |
avaliente-evs | Ivan Sorokin | Nick Logozzo | talregev |
ayeteadoe | Jörg Bornemann | Oliver | Theodore Tsirpanis |
Azure SDK Bot | JackeyLea | Osyotr | Thomas Arcila |
Benjamin Gilbert | Jacopo Gasparetto | Pierre Wendling | Tim Flynn |
Benjamin Pearce | James Grant | Pratik Chowdhury | toge |
Branden Bonaby | Jeffrey Wardman | Rémy Tassoux | Vitalii Koshura |
Bruce Mitchener | Jeremy Rifkin | Rafael Kitover | Weihang Ding |
Carsten Rudolph | JoergAtGithub | RainChan | Yu SuiXian |
Christian Panov | Johnny Willemsen | Raul Metsma | ZXShady |
Chuck Walbourn | jreichel-nvidia | RippeR37 | Russell Greene |
Colin Cornaby | Juraj Zikmund | Rossmaxx | |
CQ_Undefine | Kadir | RuslanSemchenko |
You can find the main release notes on GitHub. Recent updates to the vcpkg tool can be viewed on the vcpkg-tool Releases page. To contribute to vcpkg documentation, visit the vcpkg-docs repo. If you’re new to vcpkg or curious about how a package manager can make your life easier as a C/C++ developer, check out the vcpkg website – vcpkg.io.
If you would like to contribute to vcpkg and its library catalog, or want to give us feedback on anything, check out our GitHub repo. Please report bugs or request updates to ports in our issue tracker or join more general discussion in our discussion forum.
The post What’s New in vcpkg (July 2025) appeared first on C++ Team Blog.
]]>The post Dynamically Update C++ syntax using Next Edit Suggestions appeared first on C++ Team Blog.
]]>public
and private
sections of the class, adding getter/setter methods, and updating all references to respect this new access level.
GitHub Copilot now supports Next Edit Suggestions (or NES for short) to predict the next edits to come. NES in GitHub Copilot helps you stay in flow by not only helping predict where you’ll need to make updates, but also what you’ll need to change next.
At Microsoft Build, we showed how NES can dynamically update C++ code, including an example of updating code syntax that was using C functions to use the C++ Standard Template Library (STL).
For example, when updating code that reads from stdin from C-style code that uses raw character arrays to C++ code that uses the std::string
type, NES predicts and suggests updates across all applicable areas near the cursor. NES replaces calls to fgets
with calls to std::getline
and replaces atoi
with the C++ std::stoi
, which has better error handling.
You can then review and make any relevant updates – for example, in this case, any other areas that call on strings.
Next Edit Suggestions is now available in both Visual Studio and VS Code. As you try out NES, we’d love to hear your feedback. Share your feedback on Developer Community for Visual Studio or on GitHub for VS Code to help shape what’s next and how we can improve. If NES streamlines your workflow or saves you time, let us know – drop a comment or email us at visualcpp@microsoft.com. We’re excited to see how you’re using NES for C++!
GitHub Copilot is evolving beyond typical code completion, with features like Next Edit Suggestions, Agent Mode, and MCP transforming how developers interact with AI. The Visual Studio session at Build not only showcased NES in action, but also Agent Mode and MCP and how they each revolutionize the traditional Copilot interfaces. While NES predicts your next code edits in the editor, agent mode can work as an iterative AI assistant that understands your intent to provide dynamic edits and information.
To learn more about the C++ NES use cases detailed above and these other new features available for developers in Visual Studio, watch “Top GitHub Copilot features you missed in Visual Studio 2022”.
Try out the latest Copilot features for your C++ workflows today. To access these updates to Copilot, you’ll need an active GitHub Copilot subscription and the latest version of Visual Studio.
Our team is working hard on improving C++ integrations with Copilot, so please let us know any other enhancements you’d like to see. Share your thoughts with us on Developer Community for Visual Studio or on GitHub for VS Code to help shape what’s next and how we can improve. You can also reach us via email at visualcpp@microsoft.com, via X at @VisualC, or via Bluesky at @msftcpp.bsky.social.
The post Dynamically Update C++ syntax using Next Edit Suggestions appeared first on C++ Team Blog.
]]>