https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121053
Bug ID: 121053
Summary: std::visit<R> is not SFINAE-friendly
Product: gcc
Version: 15.1.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
I don't think this is required by the standard, but it works for the std::visit
case, just not std::visit<R>
#include <variant>
template<typename Visitor, typename Variant>
concept visitable = requires(Visitor& vis, Variant& var) {
std::visit(vis, var);
};
template<typename Res, typename Visitor, typename Variant>
concept r_visitable = requires(Visitor& vis, Variant& var) {
std::visit<Res>(vis, var);
};
struct visitor { template<typename T> int operator()(const T&) { return 1; } };
struct AmbiguousBase : std::variant<short>, std::variant<long, float> {};
Compiled with -std=gnu++20:
static_assert( ! visitable<visitor, AmbiguousBase> );
static_assert( ! r_visitable<int, visitor, AmbiguousBase> );visit.cc:18:16:
error: static assertion failed
18 | static_assert( ! r_visitable<int, visitor, BadVariant> );
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~