Поскольку строка назначается из char
, а int
неявно конвертируется в char
.
Для класса std :: string определен следующий оператор присваивания:
string& operator=( char ch );
Этот оператор вызывается неявным преобразованием unsigned int
в char
.
В третьем случае вы используете явный конструктор для создания экземпляра std :: string
, ни один из доступных конструкторов не может принимать unsigned int
или использовать неявное преобразование from 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 );
Это определенно operator = (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;
Это работает, потому что строка имеет переопределение operator = (char). Фактически вы назначаете символ (с переполнением данных) в строку. Я не знаю, почему второй случай приводит к ошибке компиляции. Я пробовал код с помощью GCC, и он компилируется.
std::string my_string(1234);
не будет работать, потому что нет строкового конструктора, который принимает аргумент char или int.