为什么“equal”在C++中适用于const char*

Why does the `equal` works for const char* in C++?

本文关键字:适用于 const char C++ equal 为什么      更新时间:2023-10-16

代码如下,它输出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;
}

我知道只有使用strcmp才能测试两个c样式字符串是否相等(因为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;
}

结果是:

 0x7fff5f73b370
 0x7fff5f73b368
 1

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

将地址存储在矢量中并进行比较(地址上的operator==)。由于地址相同,因此比较是相等的。

请注意,这是意外。它之所以"有效",只有两个原因:

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

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