This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libstdc++/77264] [7 Regression] std::string's replace gives wrong results with C++17, works with C++11


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77264

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #2)
> We end up in the new replace() overload when we should be in the const char*
> one here:
> 
>     basic_string&
>     replace(size_type __pos, size_type __n, const basic_string& __str)
>     { return this->replace(__pos, __n, __str._M_data(), __str.size()); }

We could fix Tobias's example by changing this to use c_str() instead of
_M_data(), which would pass a const char* and so call the desired overload.

That wouldn't help comment 3 though, where a (non-const) char* is passed
directly, which requires a conversion to call the overload for const char*, and
so the new overload taking a string_view is chosen by overload resolution.

With the new overload str.replace(0, 1, &c, 1) is equivalent to str.replace(0,
1, string_view{&c, 1}, 1) which replaces the specified substring with
string_view{&c, 1}.substr(1) rather than string_view{&c, 1}.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]