为什么C++允许将整数分配给字符串?

use*_*417 20 c++ string stl variable-assignment

今天我在一个程序中遇到了一个有趣的情况,我无意中将一个无符号整数分配给了一个std :: string.VisualStudio C++编译器没有给出任何关于它的警告或错误,但我碰巧在运行项目时发现了错误,它给了我字符串的垃圾字符.

这就是代码的样子:

std::string my_string("");
unsigned int my_number = 1234;
my_string = my_number;
Run Code Online (Sandbox Code Playgroud)

以下代码也编译好:

std::string my_string("");
unsigned int my_number = 1234;
my_string.operator=(my_number);
Run Code Online (Sandbox Code Playgroud)

以下结果导致错误:

unsigned int my_number = 1234;
std::string my_string(my_number);
Run Code Online (Sandbox Code Playgroud)

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

EFr*_*aim 27

因为字符串可以从中分配char,并且int可以隐式转换为char.


LBu*_*kin 22

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

string& operator=( char ch );
Run Code Online (Sandbox Code Playgroud)

通过隐式转换为unsigned intto来调用此运算符char.

在第三种情况下,您使用显式构造函数来实例化a 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 );
Run Code Online (Sandbox Code Playgroud)

  • "无法使用函数调用语法调用运算符".C++标准中的13.5(4)表示可以. (3认同)