为什么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参数。