[cfe-dev] [libc++] Should std::max allow types that require explicit bool conversion?
Jö Fahlke via cfe-dev
cfe-dev at lists.llvm.org
Thu Jul 5 11:23:23 PDT 2018
Hi!
I was surprised to find that I cannot use libc++'s `std::max(a, b)` if `a<b`
yields an object with an explicit operator bool. Is that intended, or should
I file a bug?
It seems to work for libstdc++. It also works if I use `std::max(a, b, cmp)`
and the result of `cmp(a, b)` has an explicit operator bool.
Full example <https://godbolt.org/g/cTqgvz>:
======================================================================
#include <algorithm>
struct bwrap {
bool value;
explicit operator bool() const { return value; }
};
struct iwrap {
int value;
};
bwrap operator<(iwrap a, iwrap b) { return {a.value < b.value}; }
bwrap cmp(iwrap a, iwrap b) { return {a.value < b.value}; }
int main()
{
auto v = std::max(iwrap{0}, iwrap{1});
//auto v = std::max(iwrap{0}, iwrap{1}, cmp);
return v.value;
}
======================================================================
I tried to look look in the standard (specifically, C++17), but I can't quite
figure it out:
- The two-argument signature requires LessThanComparable, which requires that
the return type of `a < b` be "convertible to bool" -- it doesn't say
whether implicitly or contextually (or at least I can't find where it does).
- For the three-argument version there is a clear statement that the return
type of `cmp(a, b)` is contextually converted to bool in [alg.sorting].
cppreference did not seem very trustworthy on that matter:
- For the two-argument version and LessThanComparable, it requires the
stricter "implicitly convertible to bool".
- For the three-argument version, it requires that the comparison object
adheres to the "Compare" requirement. The documentation for "Compare"
contradicts itself: it says "contextually convertible" in the introduction,
but "implicitly convertible" in the requirements table.
The contradition makes me reluctend to blindly trust cppreference on
LessThanComparable.
I'd be thankful if someone has hints on this one,
regards,
Jö.
Note: These sparked the whole thing:
https://gitlab.dune-project.org/core/dune-istl/merge_requests/220
https://gitlab.dune-project.org/core/dune-istl/-/jobs/44832
--
Jorrit (Jö) Fahlke, Institute for Computational und Applied Mathematics,
University of Münster, Orleans-Ring 10, D-48149 Münster
Tel: +49 251 83 35146 Fax: +49 251 83 32729
If God had intended Man to Smoke, He would have set him on Fire.
-- fortune
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180705/78cbadee/attachment.sig>
More information about the cfe-dev
mailing list