[Bug libstdc++/84690] New: std::is_invocable not working for ambiguous calls
vince.rev at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Mar 3 14:43:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84690
Bug ID: 84690
Summary: std::is_invocable not working for ambiguous calls
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: vince.rev at gmail dot com
Target Milestone: ---
Consider the following code:
==================================================
// Preamble
#include <iostream>
#include <type_traits>
// A base class
template <class T>
struct base {void operator()(T){};};
// Two derived classes inheriting from the same base classes
template <class... T>
struct derived1: base<T>... {using base<T>::operator()...;};
template <class... T>
struct derived2: base<T>... {using base<T>::operator()...;};
// A class inheriting from both derived1 and derived2
template <class T0, class... T>
struct functor: derived1<T0>, derived2<T0, T...> {
using derived1<T0>::operator();
using derived2<T0, T...>::operator();
};
// Main function
int main() {
std::cout << std::is_invocable_v<functor<int, float, char>, int> << "\n";
std::cout << std::is_invocable_v<functor<int, float, char>, float> << "\n";
std::cout << std::is_invocable_v<functor<int, float, char>, char> << "\n";
return 0;
}
==================================================
The std::is_invocable type trait from the standard library fails to detect that
the first call in the main function is ambiguous. The program returns 1, 1, 1
instead of 0, 1, 1. This seems to be related to
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84689 and to
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80245.
More information about the Gcc-bugs
mailing list