Skip to content
DevMeme
2127 of 7435
C++ Developers vs. The Standards Committee
Languages Post #2376, on Nov 27, 2020 in TG

C++ Developers vs. The Standards Committee

Why is this Languages meme funny?

Level 1: The Never-Ending Wait

Imagine you have a favorite toy that you’ve been asking your parents for every birthday. Let’s say it’s a really cool action figure that all your friends have. Each year, your parents give you nice gifts – maybe a new book, a board game, or a different cool toy – but not that action figure you really, really want. After like 3 or 4 years, you might throw your hands up and say, “This is so unfair! I’ve been asking and still didn’t get it!”

That’s exactly the feeling in this meme. C++ programmers have been asking the people in charge (the C++ committee) for a special feature (kind of like a tool or toy for their programming) called reflection. But even though the committee keeps giving them new goodies in each update of C++ (new things to play with in the language), they haven’t given this one feature that a lot of them really want. So the programmers are shown as a character from Star Wars who is upset and saying, “How could they do this? It’s outrageous, it’s unfair.” – basically a dramatic way of saying “It’s not right!”

It’s funny because the programmers are being a bit dramatic (like a kid who didn’t get their favorite toy, or like the Star Wars character who feels betrayed). The meme uses a famous movie scene to exaggerate how the developers feel. Even if you don’t know C++ or what reflection is, you can relate to that emotion of wanting something and not getting it, and thinking “ugh, not again!” The humor is in that relatable frustration being blown up to cinematic proportions. In short, the C++ folks are joking that the committee not adding reflection again makes them feel as exasperated as Anakin Skywalker did when he thought something was unfair. It’s a playful way to vent about waiting a long time for something that still isn’t here.

Level 2: Where’s Our Mirror?

Let’s break down the basics for a newer developer or someone not deep into C++ lore. The meme is about C++ (a popular programming language, known for performance and complexity) and a feature called reflection. Reflection, in simple terms, means a program can inspect itself. For example, with reflection, a program could ask an object: “Hey, what properties (fields) do you have? What are their names and types?” or “List all the methods of this class.” Many modern languages support this out of the box. If you’ve used Python, C#, or Java, you might have seen something like getting an object’s attributes dynamically or calling a method by name as a string – that’s reflection at work. It’s super handy for tasks like serialization (turning objects into strings/files), building generic frameworks, or making tools that work on any class without being explicitly told about it.

C++, however, does not have a general reflection feature in its standard library (at least as of C++20, which was the latest standard around 2020). This has been a known gap for a long time. Instead, C++ developers have to use other techniques for similar outcomes:

  • RTTI (Run-Time Type Information): C++ does have a limited form of runtime info for classes that use virtual (polymorphic classes). For instance, typeid can give you a type’s name at runtime, and dynamic_cast can check object types. But it’s nowhere near full reflection (you can’t list all members of an arbitrary struct with RTTI).
  • Templates and metaprogramming: C++ allows writing code that runs at compile time (using templates or the constexpr keyword) to generate other code. Developers get very clever with this. For example, they might write a macro or template that, given a list of field names, generates getter and setter functions automatically. However, without true reflection, you have to explicitly list those field names somewhere; the program itself can’t just discover them. This is what we mean by metaprogramming struggles – doing things at compile time to simulate what reflection would do, but it can be convoluted.

Now, who is this “C++ committee”? C++ is standardized by an international committee (ISO WG21). This is a group of experts from industry and academia who meet and decide on new C++ features every few years. Each big update of C++ (named by year, like C++17, C++20, C++23) is the result of proposals and voting in this committee. If a feature isn’t ready or agreed upon, it gets left out or delayed to the next cycle. The meme highlights that yet again, in the “new standard” (in 2020 that would be C++20, or looking forward C++23), the committee did not include a reflection feature, despite many developers asking for it. So, the community of C++ developers has been repeatedly disappointed on this particular issue.

The image itself is a familiar Star Wars meme format. The top caption sets up the context (C++ committee not including reflection), and the image with a subtitle delivers the reaction/joke. The picture is from Star Wars: Episode III – Revenge of the Sith, showing a young Anakin Skywalker speaking to the Jedi Council. In the movie scene, Anakin is upset about not being given a promotion (“not being made a Jedi Master”) and he says angrily: “How can you do this? It’s outrageous, it’s unfair!” The meme replaces “you” with “they” to aim it at the committee: “How could they do this? It’s outrageous, it’s unfair.” So basically, C++ developers = Anakin, and C++ Committee = the Jedi Council denying him what he wants. It’s an exaggerated emotional reaction to a technical disappointment.

Key terms to know from the tags and context:

  • Reflection: As explained, the capability for a program to inspect or modify its own structure. C++ hasn’t had this feature natively through many standards (despite it being common in some other languages).
  • WG21: This is just the code for the ISO Working Group 21, which is the C++ standard committee. It’s the body responsible for the C++ standard’s evolution. So any joke about “WG21” is basically a joke about the committee.
  • C23 standard: C++23 (commonly we say C++23, not C23 – since C23 might confuse with the C language standard of 2023, but context here is C++). Anyway, it refers to the version of the C++ standard expected in 2023. The meme came out in 2020, so they’re looking ahead, implying that even in the upcoming C++23, reflection might still be missing.
  • Metaprogramming struggles: This refers to the difficulty of doing complex template magic or writing code that generates code, which C++ developers do a lot as a workaround for missing features like reflection. It’s a kind of inside reference: if you’ve tried to do advanced C++ template programming (to auto-generate boilerplate, etc.), you know it can be a brain-bending experience.
  • Standard committee jokes: In developer communities, people often joke about the standard committees (not just for C++, but any tech standards) being slow or not giving the people what they ask for. Here, the joke is “they did not include the thing we all asked for…again!” It’s a gentle ribbing of the committee’s decisions.
  • Star Wars meme format: This refers to the practice of using scenes or quotes from Star Wars (which many people know) to make a point or joke in a meme. Star Wars is a common well of memes. In this case, the dramatic quote from Anakin matched perfectly to express frustration and injustice in a humorous way.

For a newer dev, imagine this scenario: You and many others have been asking for a particular improvement in your programming language to make your life easier. The folks in charge release a big update, you eagerly check the features… and that improvement you wanted is not there. Again. It’s a bit disappointing, right? C++ devs have felt that about “reflection” multiple times. Thus, the meme – it’s the community collectively rolling their eyes and throwing up their hands in a comedic fashion.

To illustrate how reflection would help and why its absence is notable, consider a simple C++ struct and what you have to do today versus a hypothetical reflection future:

struct Product {
    std::string name;
    double price;
    int stock;
};
Product item{"Gadget", 19.99, 42};

// Without reflection, if we want to, say, print all fields of Product:
std::cout << "name: " << item.name
          << ", price: " << item.price
          << ", stock: " << item.stock << "\n";

// This is fine for one struct, but you'd have to manually write similar code for every struct/class.

// Hypothetical future with reflection (not actual C++ code, but conceptually):
for (auto field : reflect(item)) {                    // reflect() returns something like a list of fields
    std::cout << field.name() << ": " << field.value(item) << "\n";
}
// The loop automatically iterates over all fields of the object, printing name and value.
// We can't do this today because C++ has no built-in reflect() or equivalent meta-object interface.

In the above pseudo-code, reflect(item) is the fantasy feature C++ devs want – an easy way to introspect item and get its fields. Right now, such a thing doesn’t exist, so developers must explicitly handle each field or use alternative techniques as mentioned. That’s why each time the language standard is updated without this, it’s a bit of a letdown. The meme encapsulates exactly that letdown with a dash of nerdy humor.

Level 3: The Reflection Refusal Saga

For seasoned C++ engineers, this meme hits on a long-running saga in the C++ community. Every few years, the ISO committee (WG21) releases a new standard (e.g. C++11, C++14, C++17, C++20, and so on). And each time, there’s a chorus of developers asking: “Will we finally get native reflection in this version?” Reflection – the ability for a C++ program to inspect its own structure (classes, fields, functions) without tons of macros or manual code – has been a top wishlist item for over a decade. Yet, as the meme laments, the committee keeps postponing it. The top text sets the scene: “When the C++ committee does not include reflection in the new standard yet again.” By 2020 (when C++20 was fresh off the press), many devs felt a mix of resignation and outrage that even after C++11 (which was released in 2011), and all the standards since, no standardized reflection API exists.

This frustration is very real. In practice, without reflection, C++ programmers resort to metaprogramming acrobatics to achieve similar outcomes. Need to serialize an object to JSON or compare two objects field-by-field? In languages like C# or Java, you might simply call a generic library that uses reflection to iterate over all fields. In C++, you end up either writing repetitive boilerplate manually or using template metaprogramming tricks and code generation. For example, frameworks like Qt had to invent a separate MOC (Meta-Object Compiler) to preprocess and generate code for features like signals and slots (essentially a custom reflection system) because standard C++ couldn’t introspect classes. Template libraries (Boost.Hana, MagicEnum, etc.) provide hacky compile-time introspection, but these are complex and not built-in. Senior devs have war stories of maintaining fragile macro-based systems to register all their classes and fields just so they can do things that reflection would make trivial. It’s the kind of metaprogramming struggle that causes both awe and headaches: C++ templates are Turing-complete, and developers have built elaborate compile-time reflection-like mechanisms, but at great cost to code readability and compile times.

So when the meme shows a Star Wars scene with the subtitle “How could they do this? It’s outrageous, it’s unfair.”, experienced C++ devs chuckle and cringe simultaneously. It’s a direct quote of Anakin Skywalker angrily complaining about not being granted the rank of Master, but here it’s repurposed: C++ devs are Anakin, and the Jedi Council is the C++ committee denying them the “rank” of reflection. The humor comes from dramatizing what’s normally a dry tech issue (a feature miss in a standards document) as an epic betrayal. It’s outrageous and unfair, the meme exclaims – capturing that feeling every C++ developer has had when reading the new standard’s feature list and not seeing reflection on it again. It’s a bit of an inside joke among C++ folks: each standard gives us amazing new toys (lambda improvements, constexpr everywhere, concepts, modules, the <=> spaceship operator, etc.), yet that one feature they’ve been lusting after is always “maybe next time.”

There’s also a subtle poke at the ISO committee process. WG21 is known for its careful, consensus-driven approach. Features often go through multiple proposal revisions, lengthy discussions, and sometimes get deferred if not ready. Reflection has been debated extensively (numerous papers and proposals), but every time, there’s some blocker – performance concerns, implementation complexity, interactions with other new features (like modules), or simply lack of time to get it done right in the current cycle. Senior developers understand that getting reflection into C++ is a hard problem (per the Level 4 discussion), but that doesn’t make the wait any less frustrating. In true developer humor fashion, we cope with this frustration by memefying it.

This meme also nods at the broader theme of language evolution vs. developer demands. C++ is notorious for its balance of backward compatibility and high performance. The committee often has to say “not yet” to big features until they won’t ruin those balances. So the meme’s comedic exaggeration – likening the committee’s decision to an outrageous act – resonates especially with veterans who have followed C++ evolution for years. It’s a way of shaking our fist (lightheartedly) at the sky: “Come on, we got fancy things like constexpr std::vector in C++20, but still no reflection?!” The Star Wars quote hyperbolically amplifies that sentiment, as if the dev community were a betrayed Jedi Order.

In summary, at this experienced level, the meme is funny because it satirizes a recurring real-world scenario in the C++ community (missing reflection in the new C++ standard), using an over-the-top dramatic scene that we all recognize. It’s a shared wink and nod: we’ve all been at that exact emotional place with C++ – half joking, half genuinely exasperated – yet we carry on coding, hoping the next standard (C++23? C++26?) will finally bring balance to the Force… er, reflection to C++.

Level 4: Mirrorless Metaprogramming

At the deepest level, this meme touches on reflection in programming languages – a meta feature that lets code examine or modify its own structure (like holding up a mirror to itself). In academic terms, reflection involves a Metaobject Protocol (MOP): the language’s runtime or compiler can provide a description of program entities (classes, functions, fields) as first-class objects. Many high-level languages (think Java’s Class objects or C#’s Type info) implement a rich runtime reflection system. But C++, being a statically compiled language with a “pay for what you use” philosophy, historically lacks such built-in introspection.

Why is adding reflection to C++ so challenging? Consider the compiler and AST (Abstract Syntax Tree) implications. To enable reflection, the C++ compiler would need to generate metadata for all user-defined types (names of classes, names/types of members, etc.) that could be accessed at runtime or compile-time. This metadata bloats binaries and raises thorny questions: How to represent it efficiently? How to ensure zero-overhead for code that doesn’t use reflection (a core C++ principle)? And how to integrate reflection with C++’s template metaprogramming and constexpr (compile-time execution) machinery without introducing inconsistencies? These are non-trivial design problems. There have been technical proposals – for example, a Static Reflection TS (Technical Specification) – exploring ways to generate compile-time constexpr reflection data (essentially turning program structure into constexpr values). This would let templates enumerate class members or do compile-time reflection safely, avoiding runtime overhead. But even that involves deep changes to the language’s type system and compiler internals. The C++ committee (formally WG21, Working Group 21 of the ISO standard) has to be extremely careful with such core features to maintain C++’s performance guarantees and backward compatibility.

From a theoretical perspective, reflection introduces a form of self-reference into the language’s formal model. It’s almost recursive: the program can query its own definition. In strongly typed, ahead-of-time compiled languages, this is like teaching a brick wall to describe itself – you usually need to attach a mirror or blueprint (metadata) that the program can inspect. Historically, languages like Lisp had homoiconicity (code as data) making reflection simpler, and Java/C# rely on virtual machines that naturally carry metadata. But C++ produces straight machine code; adding a “mirror” means carefully embedding additional data or generating extra code at compile time. This lies at the intersection of compiler design and language theory. Each new C++ standard wrestles with these fundamental constraints. The meme’s humor stems from these very deep-seated issues: even as C++ evolves (C++11, C++14, C++17, C++20...), this seemingly magical feature keeps slipping away, almost as if the language itself is resisting introspection.

Description

A meme using the Anakin Skywalker 'It's outrageous, it's unfair' format from Star Wars: Episode III - Revenge of the Sith. The top caption reads, 'When the C++ committee does not include reflection in the new standard yet again'. The image below shows Anakin Skywalker looking distraught and complaining. The subtitled text at the bottom captures his famous line, 'How could they do this? It's outrageous, it's unfair'. This meme perfectly captures the long-standing frustration within the C++ community. Reflection, the ability of a program to inspect and modify its own structure and behavior at runtime, is a powerful feature available in many other modern languages. Its repeated omission from new C++ standards (like C++17, C++20, and C++23) is a major pain point for developers who are forced to rely on complex template metaprogramming and macro-based workarounds to achieve similar functionality. The meme equates the developers' feelings of being slighted by the standards committee (WG21) to Anakin's sense of injustice at not being granted the rank of Master

Comments

38
Anonymous ★ Top Pick The C++ committee treats reflection like a Jedi Master treats the dark side: they acknowledge its power, but are terrified of what will happen if they actually let anyone use it
  1. Anonymous ★ Top Pick

    The C++ committee treats reflection like a Jedi Master treats the dark side: they acknowledge its power, but are terrified of what will happen if they actually let anyone use it

  2. Anonymous

    Every time WG21 punts on reflection, another senior dev writes a 300-line constexpr template that accidentally invents category theory just to stringify a struct - zero-cost abstraction, they said

  3. Anonymous

    After 20 years of template metaprogramming gymnastics and SFINAE nightmares, C++ developers have mastered the art of compile-time reflection through sheer force of will and recursive template instantiation - who needs language support when you have 10,000-line error messages to guide you?

  4. Anonymous

    After decades of template metaprogramming gymnastics and SFINAE dark magic just to inspect types at compile time, C++ developers watching the committee defer reflection yet again is like watching Anakin's fall to the dark side - inevitable, tragic, and somehow still surprising every time it happens. Meanwhile, languages born in the 2010s ship with reflection in their MVP, but hey, at least we have concepts now... only took 20 years for those too

  5. Anonymous

    C++ reflection: the feature WG21 keeps punting like a perfect-forwarding universal reference - always almost usable, eternally undefined

  6. Anonymous

    C++ skipped reflection again, so our “metadata” is CRTP + constexpr + SFINAE + a Clang plugin - zero-cost abstraction, infinite-cost pipeline

  7. Anonymous

    WG21 defers reflection; we ship it anyway - 12k-line Clang plugin, custom IDL, and nightly builds that standardize ODR violations

  8. @GLXBX 5y

    Explain pls

  9. @Daniils_Loputevs 5y

    Russian translate: когда комитет C ++ снова не включает отражение в новом стандарте. Как они могли это сделать? Это возмутительно, это несправедливо.

    1. dev_meme 5y

      Evolution of meme text 👀

    2. @sany_nikonov 5y

      Рефлексия не переводится))

  10. @feskow 5y

    Is this a Java reference?

  11. @dfgprg 5y

    Вместо того чтобы програмить - учим новые стандарты👍

    1. dev_meme 5y

      Isn’t this a same thing? Btw, couldn’t you stick to community language, please?

      1. @ANeufeld 5y

        Dafuq

      2. @GLXBX 5y

        So, community language is C++ or what?

        1. @ANeufeld 5y

          if (strcmp(&community_language, "C++"){ /* write however you want in the comments */ }

          1. Deleted Account 5y

            Ooooh

          2. @dfgprg 5y

            Looks like old good plain C

            1. @LineDiscipline 5y

              if (strcmp(&community_language, "C++"))[[ likely ]]{ /* tak lutshche? */ }

              1. Deleted Account 5y

                if ( std::strcmp(community_language.c_str(), "C++") )[[ likely ]]{ /* a tak? */ }

                1. @daniiltimachov 5y

                  std::strcmp ?🤭

                  1. Deleted Account 5y

                    yes, in fact

                    1. @daniiltimachov 5y

                      ain't std::string::compare more cplusplusish?

                      1. Deleted Account 5y

                        iirc it doesn't support char const *, so you'll need to using namespace std::string_literals; "C++"sv

                        1. @daniiltimachov 5y

                          std::string constructor: *exists*

                      2. @bit69tream 5y

                        #include <boost/algorithm/string.hpp> if (boost::iequals(community_language, std::string("C++"))) { std::cout << std::string("community language is " << std::string("c++") << std::endl << std::flush; } else { std::cout << std::string("community language is not " << std::string("c++") << std::endl << std::flush; }

                        1. Deleted Account 5y

                          why flush twice?

                          1. @bit69tream 5y

                            because

                        2. @daniiltimachov 5y

                          boost rocks 4real

                        3. Deleted Account 5y

                          using namespace std::string_literals; std::cout << "community language is " << (community_language == "C++"sv ? "C++" : "not C++") << '\n';

                          1. Deleted Account 5y

                            std::endl does a flush and that's slow, so it's going away

                2. @bit69tream 5y

                  cumunity_language == "C++"

                  1. Deleted Account 5y

                    i wanted that to be the next iteration

          3. @dfgprg 5y

            Btw, 2 errors in expression

            1. @ANeufeld 5y

              Hmm, I only see one error, that missing parenthesis.

        2. @Agent1378 5y

          Or Php

  12. Deleted Account 5y

    i want those contracts too

Use J and K for navigation