我今天在程序中遇到了一个有趣的情况,我无意中将无符号整数分配给了std :: string。 VisualStudio C ++编译器没有给出任何关于它的警告或错误,但我碰巧在运行项目时发现了错误,它给了我字符串的垃圾字符。
这就是代码的样子:
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);
发生了什么事?为什么编译器会使用最后一个代码块停止构建,但是让前两个代码块构建?
答案 0 :(得分:27)
因为字符串可以从char
分配,int
可以隐式转换为char
。
答案 1 :(得分:22)
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 );
答案 2 :(得分:0)
肯定是operator =(char ch)调用 - 我的调试器进入了那个。我的MS VS 2005编译后无误。
std::string my_string("");
unsigned int my_number = 1234;
my_string = my_number;
my_string.operator=(my_number);
答案 3 :(得分:-1)
我可以解释第一和第三种情况:
my_string = 1234;
这是有效的,因为string已重写operator =(char)。您实际上是在字符串中分配一个字符(带有数据溢出)。我不知道为什么第二种情况会导致编译错误。我尝试使用GCC编写代码并进行编译。
std::string my_string(1234);
不起作用,因为没有字符串构造函数接受char或int参数。