https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107958
--- Comment #9 from Ruslan Nikolaev <nruslan_devel at yahoo dot com> --- Interestingly, if I change the code a little bit and have a pair in the constructor rather than two arguments, gcc seems to compile the code: #include <iostream> #include <utility> struct PairPtr { PairPtr() {} PairPtr(const PairPtr &s) { a = s.a; b = s.b; } explicit PairPtr(const std::pair<int *, int *>& pair) { a = pair.first; b = pair.second; } PairPtr& operator=(const PairPtr &s) { a = s.a; b = s.b; return *this; } PairPtr& operator=(const std::pair<int *, int *>& pair) { a = pair.first; b = pair.second; return *this; } private: int *a; int *b; }; void func(int *a, int *b) { PairPtr p({a,b}); // works p = { a, b }; // also works }