14

为什么在使用 将其附加到字符串之前需要显式number 0转换为?charstring::operator+

using namespace std;

int main()
{

    string s = "";
    s += 65; // no compile error
    s += (char)0; // requires explicit cast 
    //s += 0; // compile error
    return 0;
}

更新澄清:我的目标是将一个字节(包含任何值,包括零)附加到现有的字节数组。

4

7 回答 7

8

因为s += 0对于以下 += 的重载运算符不明确

string& operator+= ( const char* s );
string& operator+= ( char c );

0对于第一个函数,表示第一个字符设置为 NULL 的以 NULL 结尾的字符串,对于第二个函数,是一个值设置为 的单个字符0

于 2011-12-18T07:47:54.987 回答
7

这是因为 ONLY0可以隐式转换为指针类型。没有其他整数可以隐式转换为指针类型。在您的情况下,0可以转换为const char*char两者。当它转换为const char*时,它变成了一个空指针。

因此对于应该进行哪种转换存在歧义,因为operator+=对于每种类型的参数都有两个重载:const char*char

但是当你使用非零整数时,比如说65,它不能转换成const char*. 所以它唯一可以调用的函数是一个以char参数为参数的函数,因为65它被转换为char.

于 2011-12-18T07:48:41.867 回答
4

编译器将s += 0;其视为模棱两可的调用。它同时将operator+=(char*)operator+=(char)视为有效调用。

正如所有其他回复所说,std::string无法附加整数。但是,这个答案并没有真正解决您的问题,因为您将整数附加到65一行中,这不会导致您出错。

首先,这似乎是您的 C++ 实现中的不符合规范;这不应该工作。但是,既然如此,为什么追加0失败?原因是 C++ 编译器将文字0视为整数或空指针,具体取决于上下文。(添加了 C++11 和添加的nullptr朋友减轻这种混淆。)

因此,当您的实现看到这条线时

s += 0;

它无法在调用operator+=(char*)和之间做出决定operator+=(char)

于 2011-12-18T07:48:10.653 回答
1

查看C++ 字符串参考。定义了以下重载:

string& operator+= ( const string& str );
string& operator+= ( const char* s );
string& operator+= ( char c );

为了让 C++ 理解你想要做什么,你需要附加一些类型匹配这些签名之一的东西。

于 2011-12-18T07:36:15.477 回答
1

每个人都告诉你的是0a int,availabeoperator+=()采用 achar或 a char*,0(但没有其他整数)可以转换为两者,因此存在歧义。

每个人都忘了告诉你的是,正确的成语不是演员,而是使用charlitteral

s += '\0';
于 2011-12-18T08:29:49.213 回答
0

如果您的目标是让字符串等于“A”,那么您应该简单地执行以下操作:

string s = "";
s += 65;

在 C++ 中,您不需要在字符串的末尾放置一个空字符(0'\0''0'或类似的东西)。事实上,你绝不能这样做。这与 C 不同,在 C 中您确实需要仔细考虑这一点。

你的目标是什么?如果你不想要一个简单的“A”作为你的字符串,也许你想要“A0”,在这种情况下你会做string s = "";s += 65;s += '0';return 0;

于 2011-12-18T11:03:46.330 回答
-2

string代表字符。0表示一个整数。您必须将类型转换为 char 才能兼容。

请注意,这'0'将是一个角色,并且不需要演员表。

于 2011-12-18T07:35:20.833 回答