https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82134
Arne Vogel <arvo at me dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |arvo at me dot com --- Comment #4 from Arne Vogel <arvo at me dot com> --- @Jakub Jelinek: Returning empty structs (this affects empty tuples as well) can be useful in templates. E.g. struct empty_t {}; template<typename C> void executeContext() { auto savedState = C::prepare(); C::execute(); C::cleanup(std::move(savedState)); } /* * Context which does not require saving state but should be compatible * with executeContext(). */ struct StatelessContext { static empty_t prepare(); static void execute(); static void cleanup(empty_t); }; // Usage: executeContext<StatelessContext>(); Obviously, void does not work here *precisely* because executeContext saves (i.e. uses) the return value. I have an example that makes more sense than the above, but takes longer to explain. Anyway, I hope you get the idea. A possible workaround is e.g. to use a dummy char instead. The documentation says (slightly misleadingly, see below) empty structs in G++ are treated as though they contained a single char. But this in turn may cause unwanted interference e.g. with empty base optimization.