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> );
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Reply via email to