21

我今天在一个程序中遇到了一个有趣的情况,我无意中将一个无符号整数分配给了 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);

到底是怎么回事?为什么编译器会用最后一个代码块停止构建,但让前 2 个代码块构建?

4

4 回答 4

27

因为 string 可以从 分配char,并且int可以隐式转换为char

于 2009-07-24T13:39:36.700 回答
23

std::string 类定义了以下赋值运算符:

string& operator=( char ch );

unsigned int此运算符由to的隐式转换调用char

在您的第三种情况下,您正在使用显式构造函数来实例化 a std::string,没有可用的构造函数可以接受 a 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 );
于 2009-07-24T13:44:02.063 回答
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);
于 2009-07-24T13:47:01.200 回答
-1

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

my_string = 1234;

这是有效的,因为 string 已覆盖 operator=(char)。您实际上是在字符串中分配一个字符(数据溢出)。我不知道为什么第二种情况会导致编译错误。我用 GCC 尝试了代码,它确实可以编译。

std::string my_string(1234);

将不起作用,因为没有采用 char 或 int 参数的字符串构造函数。

于 2009-07-24T14:05:14.437 回答