Donald Rumsfeld forgot the zero-sized unknown: you know its type, you know its complete value, but you don't know which instance it is.

https://en.wikipedia.org/wiki/There_are_unknown_unknowns

COM would ask the object for its canonical IUnknown pointer. Rust answers that the question has been optimized away.

A ZST has one possible value, not one possible occurrence. That doesn't prove that no identity-dependent algorithm can exist; it proves that a ZST cannot carry the identity such an algorithm requires. If identity matters, it must be represented somewhere -- and then it is no longer zero-overhead.

COM is essentially a language-neutral ABI built from C++-style vtables, and QueryInterface is essentially a type-safe dynamic_cast.

In Rumsfeldian terms, IUnknown provides a known way to interrogate an otherwise unknown object. QueryInterface resolves known unknowns by asking about specific interface IDs; it cannot ask about unknown unknowns.

https://news.ycombinator.com/item?id=12975257

> COM is essentially a formal way of using C++ vtables [1] from C and other languages, so you can create and consume components in any language, and call back and forth between them. It's a way of expressing a rational subset of how C++ classes work and format in memory, in a way that can be implemented in other languages.

> It was the outcome of the C / C++ / Visual Basic language wars at Microsoft.

> you know its type, you know its complete value, but you don't know which instance it is.

Is it an incoherent view to consider there to only be one instance? I understand Rust considers () its "unit type" a ZST.

Reading https://en.wikipedia.org/wiki/Unit_type, your question "which instance is it" seems equivalent to asking Python "but which None instance is it?"