gpt4 book ai didi

c++ - 字符串的 std::end 是否应该指向空终止符?

转载 作者:太空狗 更新时间:2023-10-29 20:39:58 24 4
gpt4 key购买 nike

我注意到当涉及到字符串或字符数组时,std::end 将始终引用 null 终止符。我认为 std::end 应该指的是最后一个有效元素之后的数组末尾。 '\0' 不被认为是有效元素吗?它是数组的一部分。以下是一些全部返回 true 的测试:

#include <iostream>

int main()
{
std::string s("hello!");
auto s_end = *(s.data() + s.size() + 1);
std::cout << std::boolalpha << (*std::end(s) == s_end) << "\n"
<< (s_end == '\0') << "\n";
char buf[6 + 1];
std::copy(s.begin(), s.end(), &buf[0]);
auto buf_end = *(buf + s.size() + 1);
std::cout << (*std::end(buf) == buf_end) << "\n"
<< (buf_end == '\0') << "\n";

char test[3] = {'h', '\0', 'e'};
std::cout << (*std::end(test) == '\0');
return 0;
}

最佳答案

对于字符数组,std::end确实指向数组中的最后一个字符。对于

char test[3] = {'h', '\0', 'e'};

指针std::end(test)test + 3相同.取消引用它与评估 test[3] 相同.这是未定义的行为。在您的特定情况下,它恰好产生了 '\0' .但总的来说,它可能会产生不同的值(value),或崩溃,或完全不同的东西。 std::end(test) 指向'\0'数组中索引 1 处的字符 test !

请注意 std::end对所有数组表现一致。也就是说,如果我们有一个数组 T a[N] , 然后 std::end(a)返回 a + N ,无论是否Tchar或者a的内容是什么是。它不会给你字符串的结尾;它给你数组的结尾。同样,返回值始终是 a + N .没有异常(exception)!

对于 std::string ,有一个终止空字符,但它不被视为字符串的一部分。 (与其他字符不同,您不允许修改它,否则会出现未定义的行为。)如果您有

std::string s("hello");

然后 s[5]将具有空字符的值,但正如我所说,它不被视为字符串的一部分:s被认为有五个字符,而不是六个。最好想到std::string因为根本没有被空终止。最后一个字符是 s[4]具有值(value)'o' , 和 std::end(s)是刚刚过去的迭代器 std::begin(s) + 4 , 即 std::begin(s) + 5 .

这比看起来要微妙一些,因为标准在技术上不保证 std::end(s)完全是可取消引用的,因此您不一定可以说它指向终止的 null。实际上,它确实指向终止 null,但取消引用它仍然是未定义的行为。

关于c++ - 字符串的 std::end 是否应该指向空终止符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25925594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com