https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86751
Bug ID: 86751
Summary: Ambiguous operator= overload for std::pair<T1, T2>
Product: gcc
Version: 7.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: m.cencora at gmail dot com
Target Milestone: ---
Following program does not compile since gcc 6.3
(this looks similar to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79141)
#include <utility>
struct dummy
{
template <typename T>
operator T() const
{
return {};
}
};
int main()
{
dummy d;
std::pair<int, int> s;
s = d;
}
Following error is produced:
<source>: In function 'int main()':
<source>:16:9: error: ambiguous overload for 'operator=' (operand types are
'std::pair<int, int>' and 'dummy')
s = d;
^
In file included from
/opt/compiler-explorer/gcc-6.3.0/include/c++/6.3.0/utility:70:0,
from <source>:1:
/opt/compiler-explorer/gcc-6.3.0/include/c++/6.3.0/bits/stl_pair.h:359:7: note:
candidate: std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(typename
std::conditional<std::__and_<std::is_copy_assignable<_Tp>,
std::is_copy_assignable<_T2> >::value, const std::pair<_T1, _T2>&, const
std::__nonesuch&>::type) [with _T1 = int; _T2 = int; typename
std::conditional<std::__and_<std::is_copy_assignable<_Tp>,
std::is_copy_assignable<_T2> >::value, const std::pair<_T1, _T2>&, const
std::__nonesuch&>::type = const std::pair<int, int>&]
operator=(typename conditional<
^~~~~~~~
/opt/compiler-explorer/gcc-6.3.0/include/c++/6.3.0/bits/stl_pair.h:370:7: note:
candidate: std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(typename
std::conditional<std::__not_<std::__and_<std::is_copy_assignable<_Tp>,
std::is_copy_assignable<_T2> > >::value, const std::pair<_T1, _T2>&, const
std::__nonesuch&>::type) [with _T1 = int; _T2 = int; typename
std::conditional<std::__not_<std::__and_<std::is_copy_assignable<_Tp>,
std::is_copy_assignable<_T2> > >::value, const std::pair<_T1, _T2>&, const
std::__nonesuch&>::type = const std::__nonesuch&] <deleted>
operator=(typename conditional<
^~~~~~~~
/opt/compiler-explorer/gcc-6.3.0/include/c++/6.3.0/bits/stl_pair.h:376:7: note:
candidate: std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(typename
std::conditional<std::__and_<std::is_move_assignable<_Tp>,
std::is_move_assignable<_T2> >::value, std::pair<_T1, _T2>&&,
std::__nonesuch&&>::type) [with _T1 = int; _T2 = int; typename
std::conditional<std::__and_<std::is_move_assignable<_Tp>,
std::is_move_assignable<_T2> >::value, std::pair<_T1, _T2>&&,
std::__nonesuch&&>::type = std::pair<int, int>&&]
operator=(typename conditional<
^~~~~~~~