C++ Logo


Advanced search

Re: [std-proposals] Proposal (Floating Idea): Make prefix for members of standard structs that will never be used

From: Noah Goldstein <goldstein.w.n_at_[hidden]>
Date: Mon, 3 Apr 2023 17:31:40 -0500
On Mon, Apr 3, 2023 at 4:15 PM Lénárd Szolnoki via Std-Proposals
<std-proposals_at_[hidden]> wrote:
> On 3 April 2023 21:35:02 BST, Noah Goldstein via Std-Proposals <std-proposals_at_[hidden]> wrote:
> >Hi All,
> >
> >Idea:
> >The idea is to reserve a prefix that will never be used for any member
> >in standard structs/classes.
> >
> >For example if the prefix 'nostd_' is chosen, then the standard is
> >agreeing to never make a member that matches 'nostd_*'.
> >
> >Rationale:
> >The rationale is it is sometimes desirable to use custom fields in
> >template parameters to support querying for custom features.
> >
> >For example martinus' quite popular unordered_map implementation [1]
> >gives users the ability to tune a performance attribute by adding an
> >'is_avalanche' flag to the hash struct [2].
> >```
> >class hash_unknown_quality {
> >....
> >}; // The implementation will do extra work to improve the output hash.
> >
> >class hash_high_quality {
> >using is_avalanching = void;
> >....
> >}; // The implementation will assume the output hash is already good.
> >```
> >
> >Current Issue:
> >Under the SD-8 guidelines[3] there is no field in standard structs
> >that can be safely assumed to never be used. This can undo any tuning
> >value gained by custom fields and makes it impossible to safely use
> >custom fields to control correctness related characteristics.
> >
> >For example 'std::hash' may create a field 'is_avalanching' and
> >attach a completely different meaning to it, ultimately undoing the
> >value of check in martinus' unordered_map.
> >
> >Benefit of this Proposal:
> >Under this proposal, all custom fields could be prefixed with the
> >chosen prefix. This would make these custom fields more reliably
> >usable for tuning purposes and safely usable for correctness purposes.
> >As well, it may prevent future blockers when trying to upgrade
> >standard versions as all custom field checks using the prefix can be
> >safely upgraded.
> >
> >For example if 'is_avalanching' was replaced with
> >'nostd_is_avalanching' there would never be the issue of `std::hash`
> >creating the field 'nostd_is_avalanching'.
> >
> >
> >
> >[1]: https://github.com/martinus/unordered_dense
> >[2]: https://github.com/martinus/unordered_dense#3-extensions
> >[3]: https://isocpp.org/std/standing-documents/sd-8-standard-library-compatibility
> Customisation points through class members this way is generally problematic for the exact reason you describe.
> However carving out names that are reserved for user code doesn't solve the problem. Consider an other 3rd party library also using "is_avalanching" with a different meaning. Which library gets to own the name?

It's not the goal of every library to be compatible with every other one,
but it is the goal of just about every library to be compatible with the
standard library. This just makes being compatible with the standard
library more reliable and long-term.

> There are alternative designs how a library can provide customisation points that doesn't suffer from this problem, like traits or tag_invoke. Or at least there the name collision has to happen on fully qualified names for this to become a problem.

Fair enough, it seems tag_invoke is just a better way of doing
> Cheers,
> Lénárd
> --
> Std-Proposals mailing list
> Std-Proposals_at_[hidden]
> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals

Received on 2023-04-03 22:31:53