Ответ 1
Поскольку строка назначается из char
, а int
неявно конвертируется в char
.
Сегодня я обнаружил интересную ситуацию в программе, где я непреднамеренно назначил целое число без знака в 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 блока кода?
Поскольку строка назначается из char
, а int
неявно конвертируется в char
.
Класс 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 );
Это определенно оператор = (char ch) call - мой отладчик вступил в это. И мой MS VS 2005 компилируется без ошибок.
std::string my_string("");
unsigned int my_number = 1234;
my_string = my_number;
my_string.operator=(my_number);
Я могу объяснить первую и третью ситуации:
my_string = 1234;
Это работает, потому что строка имеет переопределенный оператор = (char). Фактически вы назначаете символ (с переполнением данных) в строку. Я не знаю, почему второй случай приводит к ошибке компиляции. Я пробовал код с GCC, и он компилируется.
std::string my_string(1234);
не будет работать, потому что нет конструктора строк, который принимает аргумент char или int.