Кастинг "число 0" до char перед добавлением его

Зачем мне явно выделять number 0 в char перед добавлением его в строку с помощью string::operator+?

using namespace std;

int main()
{

    string s = "";
    s += 65; // no compile error
    s += (char)0; // requires explicit cast 
    //s += 0; // compile error
    return 0;
}

Обновление для уточнения. Моя цель состояла в том, чтобы добавить один байт (содержащий любое значение, включая нуль) в существующий массив байтов.

Ответы

Ответ 1

Потому что s += 0 неоднозначно для следующих перегруженных операторов + =

string& operator+= ( const char* s );
string& operator+= ( char c );

0 для первой функции означает строку с нулевым завершением с первым символом, установленным в NULL, а для второй функции - один символ со значением, установленным на 0.

Ответ 2

Это потому, что ТОЛЬКО 0 может быть неявно преобразован в тип указателя. Никакое другое целое число неявно может быть преобразовано в тип указателя. В вашем случае 0 можно преобразовать в const char* и char для обоих. Когда он преобразуется в const char*, он становится нулевым указателем.

Таким образом, существует двусмысленность в отношении того, какое преобразование должно иметь место, поскольку для каждого типа аргументов имеются две перегрузки operator+=: const char* и char.

Но когда вы используете ненулевое целое число, скажем 65, он не может преобразовать в const char*. Таким образом, единственная функция, которую он может вызвать, - это та, которая принимает char как аргумент, так как 65 преобразуется в char.

Ответ 3

Представление компилятора s += 0; как неоднозначный вызов. Он видит как operator+=(char*) и operator+=(char) как действительные вызовы.

Как и все остальные ответы, std::string не имеет возможности добавить целое число. Однако этот ответ действительно не затрагивает ваш вопрос, поскольку вы добавляете целое число 65 в одну строку, и это не вызывает ошибки.

Во-первых, это похоже на несоответствие в вашей реализации на С++; это не должно работать. Но, учитывая, что это так, почему добавление 0 не выполняется? Причина в том, что компиляторы С++ рассматривают литерал 0 как целое число или нулевой указатель, в зависимости от контекста. (С++ 11 добавил nullptr и друзей в добавить в облегчить этот источник путаницы.)

Поэтому, когда ваша реализация видит строку

s += 0;

он не может решить между вызовами operator+=(char*) и operator+=(char).

Ответ 4

Посмотрите на ссылку на строку С++. Определены следующие перегрузки:

string& operator+= ( const string& str );
string& operator+= ( const char* s );
string& operator+= ( char c );

Чтобы С++ понимал, что вы хотите сделать, вам нужно добавить что-то, тип которого соответствует одной из этих подписей.

Ответ 5

Все, что вам сказали, это 0 - это int, что availabe operator+=() принимает char или char*, что 0 (но не другие целые числа) можно преобразовать в оба и так есть двусмысленность.

То, что все забыли сказать вам, это то, что правильная идиома - это не актерский состав, а использование char litteral

s += '\0';

Ответ 6

Если ваша цель состоит в том, чтобы строка была равна "A", вы должны просто сделать:

string s = "";
s += 65;

В С++ вам не нужно помещать нулевой символ (0 или '\0' или '0' или что-то в этом роде) в конце строк. На самом деле, вы не должны этого делать. Это отличается от C, где вам часто нужно тщательно обдумать это.

Какую цель вы ставите? Если вам не нужна простая "A" в качестве вашей строки, возможно, вы хотите "A0", и в этом случае вы сделали бы string s = "";s += 65;s += '0';return 0;

Ответ 7

string представляет символы. 0 представляет собой целое число. Чтобы быть совместимым, вы должны ввести cast в char.

Обратите внимание, что '0' будет символом, и ему не потребуется литье.