Приведение "номер 0" к символу перед добавлением его - PullRequest
14 голосов
/ 18 декабря 2011

Зачем мне явно приводить 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;
}

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

Ответы [ 7 ]

8 голосов
/ 18 декабря 2011

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

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

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

7 голосов
/ 18 декабря 2011

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

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

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

4 голосов
/ 18 декабря 2011

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

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

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

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

s += 0;

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

1 голос
/ 18 декабря 2011

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

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

s += '\0';
1 голос
/ 18 декабря 2011

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

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

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

0 голосов
/ 18 декабря 2011

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

string s = "";
s += 65;

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

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

0 голосов
/ 18 декабря 2011

string представляет символы. 0 представляет целое число. Вы должны набрать приведение к символу, чтобы быть совместимым.

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

...