[Bug c++/86439] New: CTAD with deleted copy constructor fails due to deduction-guide taking by value
barry.revzin at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Jul 9 12:01:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86439
Bug ID: 86439
Summary: CTAD with deleted copy constructor fails due to
deduction-guide taking by value
Product: gcc
Version: 8.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: barry.revzin at gmail dot com
Target Milestone: ---
Reduced from: https://stackoverflow.com/q/51244047/2069064
struct NC {
NC() = default;
NC(NC const&) = delete;
NC& operator=(NC const&) = delete;
};
template <int>
struct C {
C(NC const&);
};
C(NC) -> C<0>;
int main() {
NC nc;
C c(nc);
}
clang accepts.
gcc rejects this program with:
<source>: In function 'int main()':
<source>:16:11: error: class template argument deduction failed:
C c(nc);
^
<source>:16:11: error: use of deleted function 'NC::NC(const NC&)'
<source>:3:5: note: declared here
NC(NC const&) = delete;
^~
<source>:12:1: note: initializing argument 1 of 'C(NC)-> C<0>'
C(NC) -> C<0>;
^
But nowhere do we need to copy NC here. CTAD doesn't require invoking the
function, just picking the best viable candidate. And once we pick C<0>,
actually constructing a C<0> is fine since it doesn't require a copy.
More information about the Gcc-bugs
mailing list