C++ 中字符串的问题,有如下两段代码:
代码一:
代码二:
编译后发现,代码一可以通过编译,而代码二却会报错。在gcc中报错为:
原来在C++中,字符串常量(像"Hello")不是std::string类型,而是字符数组,或者说是C风格的字符串。所以对于代码二
const std::string message = "Hello" + ", world" + exclam;
这行来说,编译器是这样解释的:
const std::string message = const char[6] + const char[8] + std::string;
由于"+"是左结合性的,所以上句相当于:
const std::string message = ((const char[6] + const char[8]) + std::string);
也就是先计算最左边的加法,所得结果再传给右边的加法。所以编译器试着去计算const char[6] + const char[8],但是并没有为数组定义这样的加法(即没有为数组重载加法运算符)。虽然数组被隐式的转换为指针,但是const char* + const char*也并不能帮组编译器,因为同样没有为两个指针之间定义加法运算。
这时候,编译器并不知道你想把结果转换为std::string类型。
而代码一之所以能够通过编译是因为这时候编译器看到的运算是:
std::string + const char[8] + const char[2]
在这里,第一个加法被转换为 std::string + const char*,这样的一个加法运算是已定义了的,返回类型为 std::string。所以编译器能成功地计算出第一个加法,并且结果是一个字符串,这时候第二个加法就变成了 std::string + const char[2],和之前一样,先被转换为 std::string + const char*,编译器可以成功的运算并再次返回std::string类型。