[Bug c++/87676] New: Presence of variadic constructor template breaks overload resolution for other constructors
harald at gigawatt dot nl
gcc-bugzilla@gcc.gnu.org
Sun Oct 21 13:12:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87676
Bug ID: 87676
Summary: Presence of variadic constructor template breaks
overload resolution for other constructors
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: harald at gigawatt dot nl
Target Milestone: ---
Reduced testcase:
struct S1 { S1(int, int, int); };
struct S2 {
S2(const S2 &) = delete;
S2(const S1 &);
S2(S1 &&);
template <typename...T> S2(T &&...);
};
S2 s({1, 2, 3});
I expect this to compile using the S2(S1 &&) constructor. Instead, GCC emits an
error:
test.cc:8:15: error: call of overloaded ‘S2(<brace-enclosed initializer
list>)’ is ambiguous
S2 s({1, 2, 3});
^
test.cc:5:3: note: candidate: ‘S2::S2(S1&&)’
S2(S1 &&);
^~
test.cc:4:3: note: candidate: ‘S2::S2(const S1&)’
S2(const S1 &);
^~
test.cc:3:3: note: candidate: ‘S2::S2(const S2&)’ <deleted>
S2(const S2 &) = delete;
^~
That is, ambiguous between the three non-template constructors. But if the
constructor template is commented out, GCC no longer sees it as ambiguous, GCC
does prefer the S2(S1 &&) overload.
I do not understand why the presence of a constructor template would affect the
overload resolution between the other constructors. FWIW, clang behaves the
same way as GCC, which is a sign that there might be a good reason for the
current behaviour, but MSVC and Intel do accept the code.
More information about the Gcc-bugs
mailing list