为什么C ++允许将一个整数分配给一个string?

今天在程序中我遇到了一个有趣的情况,那就是我无意中把一个无符号的整数赋给了std :: string。 VisualStudio C ++编译器没有给出任何警告或错误,但是当我运行这个项目时,我碰巧注意到了这个错误,并且给了我的string垃圾字符。

这是代码的样子:

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); 

到底是怎么回事? 编译器如何用最后一个代码块停止构build,而是让前两个代码块构build?

因为string可以从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)调用 – 我的debugging器步入了。 而我的MS VS 2005编译以下没有错误。

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

我可以解释第一和第三种情况:

 my_string = 1234; 

这工作,因为string已覆盖运算符=(字符)。 实际上,您将字符(数据溢出)分配到string中。 我不知道为什么第二种情况会导致编译错误。 我试了GCC的代码,它编译。

 std::string my_string(1234); 

将无法工作,因为没有string构造函数接受一个char或int参数。