Метод вставки std::string имеет неоднозначные перегрузки?
Среда: VS2005 C++ с использованием STLPort 5.1.4.
Компилируем следующий фрагмент кода:
std::string copied = "asdf";
char ch = 's';
copied.insert(0,1,ch);
Я получаю ошибку:
Error 1 error C2668: 'stlpx_std::basic_string<_CharT,_Traits,_Alloc>::insert' : ambiguous call to overloaded function
Похоже, что проблема заключается в вызове метода вставки в строковом объекте.
Две определенные перегрузки
void insert ( iterator p, size_t n, char c );
string& insert ( size_t pos1, size_t n, char c );
Но учитывая, что STLPort использует простой char* в качестве итератора, буквенный ноль в методе вставки в моем коде неоднозначен.
Так что пока я могу легко преодолеть проблему, намекнув на такие
copied.insert(size_t(0),1,ch);
Мой вопрос: является ли эта перегрузка и возможная двусмысленность преднамеренной в спецификации? Или, скорее, непреднамеренный побочный эффект конкретной реализации STLPort?
(Обратите внимание, что поставляемый Microsoft STL не имеет этой проблемы, поскольку у него есть класс для итератора, а не голый указатель)
3 ответа
Известная проблема, под названием "Не дефект". http://std.dkuug.dk/jtc1/sc22/wg21/docs/lwg-closed.html
Преднамеренная или нет, проблема больше связана с семантикой 0
чем член функции в вопросе. Возможно, дизайнеры библиотеки Microsoft (они использовали Dinkumware в прошлый раз, когда я проверял) были более осторожны в этом отношении.
Если вы различаете тип целочисленных разностей, двусмысленности нет вообще.
Команды хороших практик для хранения размеров буфера в size_t
(или же ssize_t
) типы, а не int
,
Если вы согласны с этим, звоните insert(int, int, char)
не имеет смысла, так как два первых аргумента должны быть "размерами буфера".
Если не было неявного преобразования из int
в size_t
Вы даже не могли позвонить insert()
сюда.