{"id":4844,"date":"2026-05-01T13:23:03","date_gmt":"2026-05-01T17:23:03","guid":{"rendered":"https:\/\/www.wholetomato.com\/blog\/?p=4844"},"modified":"2026-05-01T13:23:03","modified_gmt":"2026-05-01T17:23:03","slug":"cpp26-reflection-large-codebases","status":"publish","type":"post","link":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/","title":{"rendered":"C++26 Reflection: What It Actually Changes for Large Codebases"},"content":{"rendered":"<p>Reflection landed in C++26 last year, <a href=\"https:\/\/en.cppreference.com\/cpp\/compiler_support\/26\">GCC trunk<\/a> and the <a href=\"https:\/\/github.com\/bloomberg\/clang-p2996\">Bloomberg-maintained Clang fork<\/a> already implement most of it. Many conference talks is making it sound like it&#8217;s the most important thing to happen to the language in a generation. If you ship production C++ on MSVC, the more useful question is what reflection actually changes about the code you write, and when you&#8217;ll be able to write any of it on your stack.<\/p>\n<p>Here&#8217;s a short read on what&#8217;s worth your attention now, where you may want to filter the noise, and what to do about it on a stack that doesn&#8217;t have it yet.<\/p>\n<hr \/>\n<h2>What reflection actually is, in 90 seconds<\/h2>\n<p>Here&#8217;s the smallest example we can show, using the <a href=\"https:\/\/isocpp.org\/files\/papers\/P2996R13.html\">P2996R13<\/a> syntax that was voted into the standard:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-c++src&quot;,&quot;theme&quot;:&quot;duotone-dark&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:true,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">struct Point { int x; int y; };\r\n\r\nconstexpr\u00a0auto\u00a0members\u00a0=\u00a0std::meta::nonstatic_data_members_of(^^Point);\r\n\/\/\u00a0members[0]\u00a0is\u00a0a\u00a0\"reflection\"\u00a0of\u00a0Point::x\r\n\/\/ members[1] is a \"reflection\" of Point::y<\/pre>\n<\/div>\n<p>The new <code>^^<\/code> operator yields a <em>reflection<\/em> \u2014 a first-class value at compile time that represents some piece of your program. From there, dozens of new compile-time queries (<code>nonstatic_data_members_of<\/code>, <code>enumerators_of<\/code>, <code>identifier_of<\/code>, and so on) let you ask the compiler about your types, and a corresponding splice syntax (<code>[: ... :]<\/code>) lets you generate code from the answers. Both halves matter. Introspection without reification is just a fancy <code>typeid<\/code>.<\/p>\n<p>It&#8217;s <em>static<\/em> reflection. Everything happens at compile time to avoid runtime cost and stuff like RTTI overhead. And it&#8217;s part of the language now, not a third-party preprocessor or build-time codegen step glued to your project.<\/p>\n<blockquote><p>In plain English: until now, when you wanted to do something like &#8220;for every field in this struct, generate code that does X,&#8221; you had to use macros, write a code generator, or pull in a heavy template library. Reflection lets the compiler do it natively. You ask the compiler about your types, and you can use the answers to generate code in the same file.<\/p><\/blockquote>\n<h3>Quick refresher: Why does C++ need reflection<\/h3>\n<p data-start=\"2\" data-end=\"446\">C++ reflection solves a long-standing limitation: C++ types don\u2019t naturally expose their own structure. If you want to inspect fields, serialize data, or generate tools, you usually have to duplicate that information manually. Large systems like <span class=\"hover:entity-accent entity-underline inline cursor-pointer align-baseline\"><span class=\"whitespace-normal\">Unreal Engine<\/span><\/span> work around this by building custom reflection layers using macros and external code-generation tools\u2014effectively simulating a feature the language never had.<\/p>\n<p data-start=\"453\" data-end=\"774\" data-is-last-node=\"\">Modern C++ reflection aims to eliminate that complexity by letting the compiler expose type information directly at compile time. This makes it possible to automatically generate serialization, debugging, and editor tooling without macros or duplicate code\u2014all while keeping C++\u2019s zero-runtime-overhead performance model.<\/p>\n<hr \/>\n<h2>The four things this actually unlocks<\/h2>\n<h3>Enum-to-string, finally<\/h3>\n<p>The most-requested missing feature in C++ for two decades is suddenly a one-liner. You&#8217;ll see this example in every reflection talk for the next three years. There&#8217;s a reason for that: it&#8217;s the example that makes everyone in the room go &#8220;<em>finally<\/em>&#8230;&#8221;.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block\">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-c++src&quot;,&quot;theme&quot;:&quot;duotone-dark&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:true,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">template &lt;typename E&gt;\r\nconstexpr\u00a0std::string_view\u00a0enum_to_string(E\u00a0value)\u00a0{\r\n\u00a0\u00a0std::string_view\u00a0result\u00a0=\u00a0\"&lt;unknown&gt;\";\r\n\u00a0\u00a0[:\u00a0expand(std::meta::enumerators_of(^^E))\u00a0:]\u00a0&gt;&gt;\u00a0[&amp;]&lt;auto\u00a0e&gt;{\r\n\u00a0\u00a0\u00a0\u00a0if\u00a0(value\u00a0==\u00a0[:e:])\u00a0result\u00a0=\u00a0std::meta::identifier_of(e);\r\n\u00a0\u00a0};\r\n\u00a0\u00a0return\u00a0result;\r\n}<\/pre>\n<\/div>\n<p>No external code generator. No <code>X-macro<\/code> tricks. No <code>magic_enum<\/code> (much love, but it&#8217;s a workaround for a missing feature, and <a href=\"https:\/\/github.com\/Neargye\/magic_enum#enum-range\">it&#8217;s bounded by template recursion limits<\/a>). It&#8217;s just included in the language.<\/p>\n<h3>Serialization without the boilerplate<\/h3>\n<p>Every serialization library you&#8217;ve used has the same shape. It asks you to describe your types twice, once in C++ and once in some macro or trait specialization that tells the library how to walk them. With reflection, the library walks them itself.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-c++src&quot;,&quot;theme&quot;:&quot;duotone-dark&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:true,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">template &lt;typename T&gt;\r\nstd::string to_json(const T&amp; obj) {\r\n  std::string out = \"{\";\r\n  [: expand(std::meta::nonstatic_data_members_of(^^T)) :] &gt;&gt; [&amp;]&lt;auto m&gt;{\r\n    out += std::format(\"\\\"{}\\\":{},\",\r\n                       std::meta::identifier_of(m),\r\n                       to_json(obj.[:m:]));\r\n  };\r\n  out.back() = '}';\r\n  return out;\r\n}<\/pre>\n<\/div>\n<p>This significantly generalizes multiple formats in a handy process. JSON, YAML, protobuf, command-line parsers, ORM mappings, RPC stubs \u2014 anything that&#8217;s &#8220;the shape of my data, but in another format&#8221; collapses from &#8220;two places to update&#8221; to one. Rename a field, the mapping moves with it\u2014that&#8217;s a class&#8217;s worth of bugs that disappears immediately.<\/p>\n<h3>Mocking, DI, ORMs, and other &#8220;shape-driven&#8221; libraries<\/h3>\n<p>The same pattern unlocks mocking frameworks that don&#8217;t need <code>MOCK_METHOD<\/code> macros, dependency-injection containers that wire themselves up from a class definition, and ORM mappers that follow your struct around when you rename a field. None of these libraries exist on P2996 yet \u2014 the standard is too fresh \u2014 but the building blocks are now in the language, which means the libraries are coming (hopefully). The first wave will set the patterns everyone copies for the next decade.<\/p>\n<blockquote><p>Want to try the examples? All three snippets should compile on <a href=\"https:\/\/godbolt.org\/\">Compiler Explorer<\/a> using the x86-64 clang (experimental P2998) compiler from the dropdown.<\/p><\/blockquote>\n<hr \/>\n<h2>Where the hype is ahead of reality<!-- INFOGRAPHIC \u2014 assets\/hype-vs-reality.png --><!--\n\n<img decoding=\"async\" src=\"REPLACE_WITH_HYPE_VS_REALITY_URL\" alt=\"Four-quadrant infographic showing the gaps in C++26 reflection \u2014 compile times unproven, tooling lag, splice template arguments deferred to C++29, and not a runtime introspection system.\" \/>\n\n--><\/h2>\n<p><a href=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?ssl=1\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"4872\" data-permalink=\"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/hype-vs-reality\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?fit=1024%2C1536&amp;ssl=1\" data-orig-size=\"1024,1536\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"hype-vs-reality\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?fit=200%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?fit=683%2C1024&amp;ssl=1\" class=\"alignnone wp-image-4872\" src=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?resize=616%2C924&#038;ssl=1\" alt=\"Four-quadrant infographic showing the gaps in C++26 reflection \u2014 compile times unproven, tooling lag, splice template arguments deferred to C++29, and not a runtime introspection system.\" width=\"616\" height=\"924\" srcset=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?resize=683%2C1024&amp;ssl=1 683w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?resize=200%2C300&amp;ssl=1 200w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?resize=768%2C1152&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?resize=360%2C540&amp;ssl=1 360w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hype-vs-reality.png?w=1024&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p>A few caveats are worth keeping in mind, since the conference talks tend to skip them. Compile-time impact is the biggest open question \u2014 reflection runs at compile time and isn&#8217;t free, but production benchmarks are still thin on the ground. Tooling lag is the quieter one: compilers will accept reflection-based code months before debuggers, formatters, and IDE navigation fully catch up. And not everything in the original proposal made the cut. <a href=\"https:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2025\/p3687r1.html\">P3687<\/a> deferred splice template arguments to C++29 because the wording and implementation weren&#8217;t considered ready. C++26 reflection is real and it&#8217;s significant, but it isn&#8217;t the full surface area you might have read about in earlier write-ups.<\/p>\n<hr \/>\n<h2>What about Visual Studio?<\/h2>\n<p>This is the section the MSVC reader is here for, so let&#8217;s just say it.<\/p>\n<p>As of late April 2026, <strong>MSVC has no public reflection support and no published ETA<\/strong>. The <a href=\"https:\/\/devblogs.microsoft.com\/cppblog\/whats-new-for-cpp-developers-in-visual-studio-2026-version-18-0\/\">C++ Team Blog post for Visual Studio 2026 v18.0<\/a> \u2014 which ships with MSVC build tools 14.50 \u2014 does not mention reflection. The features it does highlight are C++23 conformance items, suggesting Microsoft is still finishing the previous standard before C++26 features land in earnest. The <a href=\"https:\/\/developercommunity.visualstudio.com\/t\/Implement-C26-Standard-features-in-MSV\/10777423\">Developer Community thread requesting C++26 features<\/a> has Microsoft engagement but no committed timeline for reflection specifically.<\/p>\n<p>So if you ship on MSVC: you can read about reflection, prototype it on Compiler Explorer to get a feel for the ergonomics, and audit your codebase for the patterns reflection will eventually simplify. But you can&#8217;t ship with it on stock Visual Studio yet. Based on Microsoft&#8217;s historical cadence with major C++ features (concepts, modules, and coroutines all took multiple VS releases to mature), a realistic adoption window is probably 12\u201324 months from the day MSVC first ships an experimental implementation. That&#8217;s an estimate, not a Microsoft commitment.<\/p>\n<p>There&#8217;s a useful way to think about this. Reflection is the language eventually catching up to something developers have always done with tooling: asking the codebase about itself. <em>Where is this symbol used? What&#8217;s the shape of this type? If I rename this, what breaks?<\/em> These are reflection-shaped questions, and they have answers today. They just live in your IDE instead of your source code.<\/p>\n<p>Until reflection lands in MSVC, the day-to-day version of &#8220;ask your codebase about itself&#8221; still happens through your IDE \u2014 finding references, jumping to definitions, renaming a symbol everywhere it&#8217;s used. If that workflow holds up on your codebase, you&#8217;re set. If it doesn&#8217;t, especially on large projects, heavy macros, or legacy C++ where stock IntelliSense slows down, <a href=\"https:\/\/www.wholetomato.com\/\">Visual Assist<\/a> is what we build for that case.<!-- INFOGRAPHIC \u2014 assets\/compiler-support-timeline.png --><!--\n\n<img decoding=\"async\" src=\"REPLACE_WITH_COMPILER_TIMELINE_URL\" alt=\"Three-lane timeline showing C++26 reflection support \u2014 GCC trunk (green), Clang via Bloomberg fork (green), MSVC tracking with no public ETA (red).\" \/>\n\n--><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?ssl=1\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"4873\" data-permalink=\"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/ompiler-support-timeline\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?fit=1693%2C929&amp;ssl=1\" data-orig-size=\"1693,929\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"ompiler-support-timeline\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?fit=300%2C165&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?fit=1024%2C562&amp;ssl=1\" class=\"alignnone size-large wp-image-4873\" src=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?resize=1024%2C562&#038;ssl=1\" alt=\"Three-lane timeline showing C++26 reflection support \u2014 GCC trunk (green), Clang via Bloomberg fork (green), MSVC tracking with no public ETA (red).\" width=\"1024\" height=\"562\" srcset=\"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?resize=1024%2C562&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?resize=300%2C165&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?resize=768%2C421&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?resize=1536%2C843&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?resize=360%2C198&amp;ssl=1 360w, https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/ompiler-support-timeline.png?w=1693&amp;ssl=1 1693w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<hr \/>\n<h2>Should you care right now?<\/h2>\n<p>It depends on what you ship.<\/p>\n<p>If you&#8217;re shipping production C++ on MSVC, read the spec and don&#8217;t bet on reflection landing in your workflow this year. Don&#8217;t refactor anything in anticipation. The horizon is too far out and the design might still shift in small ways.<\/p>\n<p>If you maintain libraries that other people depend on \u2014 serialization, ORM, RPC, DI containers \u2014 start sketching the reflection-based API now. The first wave of libraries that ship clean reflection-based interfaces will set the patterns everyone else copies for years.<\/p>\n<p>If you&#8217;re on GCC or Clang and you&#8217;ve been wanting to delete a code generator from your build, prototype this month. The Bloomberg fork runs in <a href=\"https:\/\/godbolt.org\/\">Compiler Explorer<\/a>. Pick the smallest codegen step in your build and try replacing it.<\/p>\n<p>And if you&#8217;re in a meeting where someone says C++26 reflection is going to change everything, they&#8217;re right and they&#8217;re wrong. It closes a gap that has existed since C++ existed. The language can finally see itself, and that will reshape how libraries get built. But not this year, not on MSVC, and probably not in the way the loudest take on Hacker News predicts. The boring uses are the ones that will matter most.<\/p>\n<p>If you&#8217;re using reflection in production already, or you have firm benchmarks on the compile-time cost, <a href=\"https:\/\/www.wholetomato.com\/contact-us\">drop us a note<\/a>. We&#8217;d genuinely like to hear what you&#8217;re seeing.<\/p>\n<hr \/>\n<p><!-- CTA BUTTON \u2014 replace with theme's button block in Visual editor if available --><\/p>\n<p style=\"text-align: center;\"><a class=\"wp-block-button__link\" style=\"display: inline-block; background-color: #e7000b; color: #ffffff; padding: 14px 28px; border-radius: 8px; text-decoration: none; font-weight: 600;\" href=\"https:\/\/www.wholetomato.com\/en\/downloads\">Try Visual Assist<\/a><\/p>\n<p style=\"text-align: center; font-size: 0.85em; color: #666;\">30-day free trial \u00b7 All features unlocked<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reflection landed in C++26 last year, GCC trunk and the Bloomberg-maintained Clang fork already implement most of it. Many conference talks is making it sound like it&#8217;s the most important thing to happen to the&#8230;<\/p>\n","protected":false},"author":213500340,"featured_media":4845,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_newsletter_tier_id":0,"footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[103,672],"tags":[726360666,726360662,726360664,6678],"class_list":["post-4844","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","category-tips-and-tricks","tag-c-language-features","tag-c26","tag-reflection","tag-visual-studio"],"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hero-cpp26-reflection.png?fit=1536%2C1024&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfpLS4-1g8","aioseo_head":"\n\t\t<!-- All in One SEO Pro 4.9.6.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"C++26 reflection landed in the standard. Here&#039;s what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"Tristan Soliven\"\/>\n\t<meta name=\"google-site-verification\" content=\"DtHrwoEjg0KG_fbuPSp5j_wNIf-g5hSh4EH6tZBoCIw\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 4.9.6.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Tomato Soup - Visual Assist Team Blog\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"C++26 Reflection: What It Actually Changes for Large Codebases\" \/>\n\t\t<meta property=\"og:description\" content=\"C++26 reflection landed in the standard. Here&#039;s what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-05-01T17:23:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-05-01T17:23:03+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/wholetomatosoftware\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@visualassist\" \/>\n\t\t<meta name=\"twitter:title\" content=\"C++26 Reflection: What It Actually Changes for Large Codebases\" \/>\n\t\t<meta name=\"twitter:description\" content=\"C++26 reflection landed in the standard. Here&#039;s what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@visualassist\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#blogposting\",\"name\":\"C++26 Reflection: What It Actually Changes for Large Codebases\",\"headline\":\"C++26 Reflection: What It Actually Changes for Large Codebases\",\"author\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/hero-cpp26-reflection.png?fit=1536%2C1024&ssl=1\",\"width\":1536,\"height\":1024,\"caption\":\"Schematic illustration of C++26 reflection \\u2014 node graph radiating from a stylized `^^` operator over a dark IDE backdrop.\"},\"datePublished\":\"2026-05-01T13:23:03-04:00\",\"dateModified\":\"2026-05-01T13:23:03-04:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#webpage\"},\"articleSection\":\"News, Tips and Tricks, C++ language features, C++26, Reflection, Visual Studio, English\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/news\\\/#listItem\",\"name\":\"News\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/news\\\/#listItem\",\"position\":2,\"name\":\"News\",\"item\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/news\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#listItem\",\"name\":\"C++26 Reflection: What It Actually Changes for Large Codebases\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#listItem\",\"position\":3,\"name\":\"C++26 Reflection: What It Actually Changes for Large Codebases\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/news\\\/#listItem\",\"name\":\"News\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\",\"name\":\"Tomato Soup\",\"description\":\"Visual Assist Team Blog\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/\",\"email\":\"info@wholetomato.com\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":0,\"maxValue\":100},\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/wt-logo.jpg?fit=400%2C400&ssl=1\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#organizationLogo\",\"width\":400,\"height\":400},\"image\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/wholetomatosoftware\",\"https:\\\/\\\/twitter.com\\\/visualassist\",\"https:\\\/\\\/www.youtube.com\\\/c\\\/Wholetomatosoftware\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/whole-tomato-software\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/\",\"name\":\"Tristan Soliven\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#webpage\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/\",\"name\":\"C++26 Reflection: What It Actually Changes for Large Codebases\",\"description\":\"C++26 reflection landed in the standard. Here's what it changes for large MSVC C++ codebases \\u2014 and what the Visual Studio support timeline looks like.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/hero-cpp26-reflection.png?fit=1536%2C1024&ssl=1\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#mainImage\",\"width\":1536,\"height\":1024,\"caption\":\"Schematic illustration of C++26 reflection \\u2014 node graph radiating from a stylized `^^` operator over a dark IDE backdrop.\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/cpp26-reflection-large-codebases\\\/#mainImage\"},\"datePublished\":\"2026-05-01T13:23:03-04:00\",\"dateModified\":\"2026-05-01T13:23:03-04:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/\",\"name\":\"Tomato Soup\",\"description\":\"Visual Assist Team Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>C++26 Reflection: What It Actually Changes for Large Codebases<\/title>\n\n","aioseo_head_json":{"title":"C++26 Reflection: What It Actually Changes for Large Codebases","description":"C++26 reflection landed in the standard. Here's what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.","canonical_url":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"google-site-verification":"DtHrwoEjg0KG_fbuPSp5j_wNIf-g5hSh4EH6tZBoCIw","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#blogposting","name":"C++26 Reflection: What It Actually Changes for Large Codebases","headline":"C++26 Reflection: What It Actually Changes for Large Codebases","author":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author"},"publisher":{"@id":"https:\/\/www.wholetomato.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hero-cpp26-reflection.png?fit=1536%2C1024&ssl=1","width":1536,"height":1024,"caption":"Schematic illustration of C++26 reflection \u2014 node graph radiating from a stylized `^^` operator over a dark IDE backdrop."},"datePublished":"2026-05-01T13:23:03-04:00","dateModified":"2026-05-01T13:23:03-04:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#webpage"},"isPartOf":{"@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#webpage"},"articleSection":"News, Tips and Tricks, C++ language features, C++26, Reflection, Visual Studio, English"},{"@type":"BreadcrumbList","@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.wholetomato.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/news\/#listItem","name":"News"}},{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/news\/#listItem","position":2,"name":"News","item":"https:\/\/www.wholetomato.com\/blog\/category\/news\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#listItem","name":"C++26 Reflection: What It Actually Changes for Large Codebases"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#listItem","position":3,"name":"C++26 Reflection: What It Actually Changes for Large Codebases","previousItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/news\/#listItem","name":"News"}}]},{"@type":"Organization","@id":"https:\/\/www.wholetomato.com\/blog\/#organization","name":"Tomato Soup","description":"Visual Assist Team Blog","url":"https:\/\/www.wholetomato.com\/blog\/","email":"info@wholetomato.com","numberOfEmployees":{"@type":"QuantitativeValue","minValue":0,"maxValue":100},"logo":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2020\/05\/wt-logo.jpg?fit=400%2C400&ssl=1","@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#organizationLogo","width":400,"height":400},"image":{"@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/wholetomatosoftware","https:\/\/twitter.com\/visualassist","https:\/\/www.youtube.com\/c\/Wholetomatosoftware","https:\/\/www.linkedin.com\/company\/whole-tomato-software"]},{"@type":"Person","@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author","url":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/","name":"Tristan Soliven"},{"@type":"WebPage","@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#webpage","url":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/","name":"C++26 Reflection: What It Actually Changes for Large Codebases","description":"C++26 reflection landed in the standard. Here's what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.wholetomato.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#breadcrumblist"},"author":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author"},"creator":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2026\/04\/hero-cpp26-reflection.png?fit=1536%2C1024&ssl=1","@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#mainImage","width":1536,"height":1024,"caption":"Schematic illustration of C++26 reflection \u2014 node graph radiating from a stylized `^^` operator over a dark IDE backdrop."},"primaryImageOfPage":{"@id":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/#mainImage"},"datePublished":"2026-05-01T13:23:03-04:00","dateModified":"2026-05-01T13:23:03-04:00"},{"@type":"WebSite","@id":"https:\/\/www.wholetomato.com\/blog\/#website","url":"https:\/\/www.wholetomato.com\/blog\/","name":"Tomato Soup","description":"Visual Assist Team Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.wholetomato.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Tomato Soup - Visual Assist Team Blog","og:type":"article","og:title":"C++26 Reflection: What It Actually Changes for Large Codebases","og:description":"C++26 reflection landed in the standard. Here's what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.","og:url":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases","article:published_time":"2026-05-01T17:23:03+00:00","article:modified_time":"2026-05-01T17:23:03+00:00","article:publisher":"https:\/\/www.facebook.com\/wholetomatosoftware","twitter:card":"summary_large_image","twitter:site":"@visualassist","twitter:title":"C++26 Reflection: What It Actually Changes for Large Codebases","twitter:description":"C++26 reflection landed in the standard. Here's what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.","twitter:creator":"@visualassist"},"aioseo_meta_data":{"post_id":"4844","title":"C++26 Reflection: What It Actually Changes for Large Codebases","description":"C++26 reflection landed in the standard. Here's what it changes for large MSVC C++ codebases \u2014 and what the Visual Studio support timeline looks like.","keywords":null,"keyphrases":{"focus":{"keyphrase":"C++26 reflection","score":63,"analysis":{"keyphraseInTitle":{"score":9,"maxScore":9,"error":0},"keyphraseInDescription":{"score":9,"maxScore":9,"error":0},"keyphraseLength":{"score":9,"maxScore":9,"error":0,"length":2},"keyphraseInURL":{"score":1,"maxScore":5,"error":1},"keyphraseInIntroduction":{"score":3,"maxScore":9,"error":1},"keyphraseInSubHeadings":{"score":3,"maxScore":9,"error":1},"keyphraseInImageAlt":{"score":9,"maxScore":9,"error":0},"keywordDensity":{"score":0,"type":"low","maxScore":9,"error":1}}},"additional":[{"keyphrase":"P2996, static reflection C++26, C++26 reflection MSVC","score":33,"analysis":{"keyphraseInDescription":{"score":3,"maxScore":9,"error":1},"keyphraseLength":{"score":6,"maxScore":9,"error":1,"length":7},"keyphraseInIntroduction":{"score":3,"maxScore":9,"error":1},"keyphraseInImageAlt":{"score":3,"maxScore":9,"error":1},"keywordDensity":{"score":0,"type":"low","maxScore":9,"error":1}}}]},"primary_term":null,"canonical_url":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases","og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"open_ai":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-04-28 18:54:40","updated":"2026-05-01 18:55:24"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.wholetomato.com\/blog\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.wholetomato.com\/blog\/category\/news\/\" title=\"News\">News<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\tC++26 Reflection: What It Actually Changes for Large Codebases\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.wholetomato.com\/blog"},{"label":"News","link":"https:\/\/www.wholetomato.com\/blog\/category\/news\/"},{"label":"C++26 Reflection: What It Actually Changes for Large Codebases","link":"https:\/\/www.wholetomato.com\/blog\/cpp26-reflection-large-codebases\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/users\/213500340"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/comments?post=4844"}],"version-history":[{"count":13,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4844\/revisions"}],"predecessor-version":[{"id":4880,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4844\/revisions\/4880"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/media\/4845"}],"wp:attachment":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/media?parent=4844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/categories?post=4844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/tags?post=4844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}