Both kinds of generated class store every parameter as std::decay_t< type > member_<name> and expose it through std::decay_t< type > const &<name>( ) const.
| Streamable | Exception | |
|---|---|---|
| name | <Name>Streamable | <Name>Exception |
| stored | parameters | internal_locale, parameters, internal_what (not with OVERRIDE) |
| constructors | ( params ) | ( params, loc ) if needed, ( params ) |
explicit | with one parameter | the non-locale constructor, with one parameter |
| destructor | virtual | virtual |
| text | PrintOn( std::ostream & ) const, operator<< | What(), what() noexcept — or the OVERRIDE method |
| base | INHERITED, default-constructed | INHERITED, default-constructed |
The member order is the declaration order above; an exception's layout is therefore locale, parameters, cached text.
Getters return a const reference to the stored value, so a getter of an std::string const & parameter returns std::string const & — valid as long as the object lives.

