replace у std::string
От: Nikita.Trophimov  
Дата: 21.12.12 18:26
Оценка:
По аналогии с boost::replace_all случайно написал следующий код:

#include <iostream>
#include <string>

int main()
{
   std::string str = "*** str ***";
   str.replace(str.begin(), str.end(), "str", "s");
   
   std::cout << str << '\n';
}


Разумеется, работать он стал совсем не так, как ожидается (это меня не удивило). Полез было в стандарт — перегруженной версии функции replace у std::string, которая принимает два итератора и два const char*, просто-напросто нет.

ISO/IEC 14882:2011

21.4 Class template basic_string [basic.string]

...

basic_string& replace(size_type pos1, size_type n1,
const basic_string& str);
basic_string& replace(size_type pos1, size_type n1,
const basic_string& str,
size_type pos2, size_type n2);
basic_string& replace(size_type pos, size_type n1, const charT* s,
size_type n2);
basic_string& replace(size_type pos, size_type n1, const charT* s);
basic_string& replace(size_type pos, size_type n1, size_type n2,
charT c);
basic_string& replace(const_iterator i1, const_iterator i2,
const basic_string& str);
basic_string& replace(const_iterator i1, const_iterator i2, const charT* s,
size_type n);
basic_string& replace(const_iterator i1, const_iterator i2, const charT* s);
basic_string& replace(const_iterator i1, const_iterator i2,
size_type n, charT c);
template<class InputIterator>
basic_string& replace(const_iterator i1, const_iterator i2,
InputIterator j1, InputIterator j2);
basic_string& replace(const_iterator, const_iterator, initializer_list<charT>);


Почему же тогда этот код прекрасно компилируется в gcc, MSVC и clang?

MSVC-11.0 попадает внутрь функции

_Myt& replace(const_iterator _First, const_iterator _Last,
const_pointer _First2, const_pointer _Last2)


Я так понимаю, что это какое-то нестандартное расширение (которое, впрочем, непонятно тогда, как следует использовать правильно).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.