https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92662
Bug ID: 92662
Summary: change in gcc 8 vs 9: call of overloaded
‘basic_string(<brace-enclosed initializer list>)’ is
ambiguous
Product: gcc
Version: 9.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: matz at gcc dot gnu.org
Target Milestone: ---
A user of ours noted a difference in behaviour between gcc8 and gcc9 regarding
braced initializers. Take this example:
---------------------------------------------
#include <string>
// allow to steal _text from rvalues
struct Test
{
std::string const& str() const& { return _text; }
std::string && str() && { return std::move(_text); }
operator std::string const&() const& { return _text; }
operator std::string && () && { return std::move(_text); }
std::string _text;
};
int main()
{
Test t;
std::string a { std::move(t).str() }; // 1
std::string b { std::move(t) }; // 2
return 0;
}
---------------------------------------------
gcc 8 accepts the program (and str() && is chosen in line 1), whereas gcc 9
only accepts line 1 but not line 2 due to:
xorig.cc: In function ‘int main()’:
xorig.cc:19:32: error: call of overloaded ‘basic_string(<brace-enclosed
initializer list>)’ is ambiguous
19 | std::string b { std::move(t) };
| ^
In file included from /usr/include/c++/9/string:55,
from xorig.cc:1:
/usr/include/c++/9/bits/basic_string.h:3628:7: note: candidate:
‘std::basic_string<_CharT, _Traits,
_Alloc>::basic_string(std::basic_string<_CharT, _Traits, _Alloc>&&) [with
_CharT = char; _Traits = std::char_traits<char>; _Alloc =
std::allocator<char>]’
3628 | basic_string(basic_string&& __str)
| ^~~~~~~~~~~~
/usr/include/c++/9/bits/basic_string.h:3564:7: note: candidate:
‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const
std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits =
std::char_traits<char>; _Alloc = std::allocator<char>]’
3564 | basic_string(const basic_string& __str);
| ^~~~~~~~~~~~
One difference is the temporary object
used for calling .str() in line 1. But still I have difficulties to see
why there's a difference in ambiguities.
So, who's right (8 or 9), and due to which reasons. (Depending on that this
is either an error in gcc 8 or 9, so I'm not marking it yet).