https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82171
Bug ID: 82171 Summary: Cant use std::declval in concept testing map operator[] Product: gcc Version: 7.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: rwdougla at gmail dot com Target Milestone: --- static_assert fires inside c++/7.2.0/type_traits:2259:7 Godbolt link: https://godbolt.org/g/raan9j Pasted here: (compiler flags are -std=c++1z -fconcepts) #include <utility> #include <type_traits> #include <iterator> template<typename T> concept bool MapLike = requires(T t) { {t[std::declval<typename T::value_type::first_type>()]} -> typename T::value_type::second_type; }; void test(MapLike T) {} #include <map> #include <vector> int main() { test(std::map<int, int>{}); //test(std::vector<std::pair<int, int>>{}); } Workaround requires bankshot through nested requirement: https://godbolt.org/g/j7kuKF #include <utility> #include <type_traits> #include <iterator> template<typename MapT, typename ValueT> concept bool HasIndexOp = requires (MapT t, ValueT v) { { t[v] } -> typename MapT::value_type::second_type; }; template<typename T> concept bool MapLike = requires(T t) { requires HasIndexOp<T, typename T::value_type::first_type>; }; void test(MapLike T) {} #include <map> #include <vector> int main() { test(std::map<int, int>{}); //test(std::vector<std::pair<int, int>>{}); }