为什么`equal`适用于C++中的const char*?

Han*_*Sun 3 c++ string algorithm stl char

代码是这样的,它输出1:

int main(int argc, char *argv[])
{
    vector <const char*> vec = {"nima","123"};
    vector <const char*> vec2 = {"nima","123"};
    auto result = equal(vec.cbegin(), vec.cend(), vec2.cbegin());
    cout << result << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道我只能通过使用来测试两个c风格的字符串是否相等strcmp(因为char*不是我所理解的对象).但这equal是一个功能<algorithm>.它是否会使==运算符超载,以便它可以测试两者的相等性char*

@Damon说他们是相同的,因为我将同一个字符串文字合并到同一个地址中,正如我所理解的那样.但是,当我尝试char*使用不同的地址时,它仍然给出了相同的结果:

int main(int argc, char *argv[])
{
char* k = "123";
char* b = "123";
vector <const char*> vec = {"nima"};
vector <const char*> vec2 = {"nima"};
cout << &k << endl;
cout << &b << endl;
vec.push_back(k);
vec2.push_back(b);

auto result = equal(vec.cbegin(), vec.cend(), vec2.cbegin());
cout << result << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

 0x7fff5f73b370
 0x7fff5f73b368
 1
Run Code Online (Sandbox Code Playgroud)

Dam*_*mon 11

这里可能发生的是编译器/链接器将四个字符串文字合并为两个文字.因此,两者"nima""123"具有相同的地址.

将地址存储在向量中并比较它们(operator==在地址上).由于地址相同,因此比较相同.

请注意,这是偶然的.它只是"有效",原因有两个:

  1. 字符串是文字(也就是说,不是从中读取的某些字符串stdin).
  2. 允许编译器,但不需要合并相同的文字(无论这是否是实现定义的).

这可能导致两种情况,你会得到一个有趣的惊喜(如果你必须找到它为什么它一直"工作"时突然不起作用),当你使用不同的编译器甚至相同时,不是很有趣具有不同优化设置的编译器,或者在分配非文字字符串时.

  • @Firegun你把`k`和`​​b`(不同)的地址与他们指向的字符串的addtess混淆(相同). (3认同)
  • "实施定义"可能比"意外"更好.相关的标准引用是§2.14.5/ 12:"是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的." (2认同)