empty()
functions in any
Section: 22.7.4.5 [any.observers] Status: NAD Submitter: Finland Opened: 2017-02-03 Last modified: 2020-09-06
Priority: Not Prioritized
View all issues with NAD status.
Discussion:
Addresses FI 7The proposal p0032 has multiple problems: 1) it turns member function .empty()
into .has_value()
, negating the logic. Refactoring e.g. existing uses of std::experimental::any
to use
std::any
thus involve non-trivial refactorings that are error- prone and can't be done via simple search-and-replace
if there are containers in the same source files for which .empty()
is used (based on the implementation experience
of making the change in libstdc++ and refactoring the testsuite). Whilst any
is not a container, the library is failing
to go towards a direction where there would be a generic way to query for emptiness. 2) The use of function references for
tag types makes the interface hard to use. The tag types do not have value semantics like every other tag type has, the tag
types are hard to construct, and present surprises for certain kinds of overload sets. Furthermore, any attempts to decay the
tag types produces a really surprising effect — as opposed to what the other tag types do, which is that the result of
decaying them is the tag type itself, decaying these new tag types results in a pointer to function.
Proposed change: Keep the .empty()
functions (and introduce them to all the types that are supposed to have a
homogeneous interface), and make the tag types be regular tag types that are not references to functions.
[2017-02-03, Marshall notes]
P0504R0 (adopted in Issaquah) removed use of function references for tag types
[ 2017-06-26 Moved to Tentatively NAD after 5 positive votes on c++std-lib. ]
Proposed resolution: