This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug libstdc++/68995] New: Including both <tr1/functional> and <functional> can cause ADL problems in std::function SFINAE
- From: "rs2740 at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 20 Dec 2015 07:29:28 +0000
- Subject: [Bug libstdc++/68995] New: Including both <tr1/functional> and <functional> can cause ADL problems in std::function SFINAE
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68995
Bug ID: 68995
Summary: Including both <tr1/functional> and <functional> can
cause ADL problems in std::function SFINAE
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: rs2740 at gmail dot com
Target Milestone: ---
Repro adapted from http://stackoverflow.com/q/34334735/2756719:
#include <tr1/memory>
#include <functional>
#include <tr1/functional>
std::tr1::shared_ptr<int> test() { return {}; }
std::function<std::tr1::shared_ptr<int>()> func = test;
This compiles iff the #include <tr1/functional> is commented out. When both
<functional> and <tr1/functional> are included, however, we get an error,
apparently because
template<typename _Functor>
using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
(std::declval<_ArgTypes>()...) );
in std::function does an unqualified call to __callable_functor, and picks up
both std::__callable_functor in <functional> from normal unqualified lookup,
and std::tr1::__callable_functor in <tr1/functional> from ADL, resulting in an
ambiguity, which in turn causes substitution failure in the converting
constructor template.