Подтвердить что ты не робот

Почему С++ разрешает целое число присваивать строке?

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

Это выглядит так:

std::string my_string("");
unsigned int my_number = 1234;
my_string = my_number;

Следующий код также отлично компилируется:

std::string my_string("");
unsigned int my_number = 1234;
my_string.operator=(my_number);

Ниже приведено сообщение об ошибке:

unsigned int my_number = 1234;
std::string my_string(my_number);

Что происходит? Почему компилятор остановит сборку с последним блоком кода, но пусть построят первые 2 блока кода?

4b9b3361

Ответ 1

Поскольку строка назначается из char, а int неявно конвертируется в char.

Ответ 2

Класс std::string имеет следующий оператор присваивания:

string& operator=( char ch );

Этот оператор вызывается неявным преобразованием unsigned int в char.

В вашем третьем случае вы используете явный конструктор для создания экземпляра std::string, ни один из доступных конструкторов не может принять unsigned int или использовать неявное преобразование из unsigned int:

string();
string( const string& s );
string( size_type length, const char& ch );
string( const char* str );
string( const char* str, size_type length );
string( const string& str, size_type index, size_type length );
string( input_iterator start, input_iterator end );

Ответ 3

Это определенно оператор = (char ch) call - мой отладчик вступил в это. И мой MS VS 2005 компилируется без ошибок.

std::string my_string("");
unsigned int my_number = 1234;
my_string = my_number;
my_string.operator=(my_number);

Ответ 4

Я могу объяснить первую и третью ситуации:

my_string = 1234;

Это работает, потому что строка имеет переопределенный оператор = (char). Фактически вы назначаете символ (с переполнением данных) в строку. Я не знаю, почему второй случай приводит к ошибке компиляции. Я пробовал код с GCC, и он компилируется.

std::string my_string(1234);

не будет работать, потому что нет конструктора строк, который принимает аргумент char или int.