From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 9D07B385800A; Thu, 9 Sep 2021 17:18:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9D07B385800A From: "pinskia at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/102257] call of overloaded 'tuple' is ambiguous Date: Thu, 09 Sep 2021 17:18:36 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 12.0 X-Bugzilla-Keywords: rejects-valid X-Bugzilla-Severity: normal X-Bugzilla-Who: pinskia at gcc dot gnu.org X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: see_also Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Sep 2021 17:18:36 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D102257 Andrew Pinski changed: What |Removed |Added ---------------------------------------------------------------------------- See Also| |https://gcc.gnu.org/bugzill | |a/show_bug.cgi?id=3D102247 --- Comment #1 from Andrew Pinski --- Take: #include #include int main() { std::tuple t{{}, 0}; } ----- CUT ---- GCC does reject this though with the following error message: : In function 'int main()': :6:44: error: converting to 'std::allocator_arg_t' from initializer list would use explicit constructor 'constexpr std::allocator_arg_t::allocator_arg_t()' 6 | std::tuple t{{}, 0}; | ^ So the question becomese does the conversion happen while chosing the overl= oad for the tuple constructor? Looks like GCC is the only one which rejects this as being ambiguous too. I did try: struct tag{}; struct alloc {explicit alloc(int){};}; template struct tuple { tuple(tag, const alloc&); tuple(const T1&, const T2&); }; class t2{}; tuple tt{{},0}; and GCC accepts this so is suprising based on the error message of the other one. Also you don't need std::string, a simple class like this will fail: #include class t2{}; int main() { std::tuple t{{}, 0}; }=