gpt4 book ai didi

c++ - `std::string::iterator` 保证不是指向 char 的指针吗?

转载 作者:太空狗 更新时间:2023-10-29 23:14:33 24 4
gpt4 key购买 nike

鉴于 operator<< 的过载在 std::ostream指向 char 的指针存在,并且鉴于该标准指定了 std::string 的概要在 §21.4 中类如下:

namespace std {
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string {
public:
[...]
typedef implementation-defined iterator;
typedef implementation-defined const_iterator;
[...]
};
}

最后考虑到 iterator 的要求和 const_iterator对于 Container概念是,在 §23.2/4 中:

enter image description here

和一个指向char的指针会让他们满意;我是否正确理解它的实现定义了以下代码是否编译?

std::string string = "abc";
std::cout << begin(string);

附带说明,GCCClang好像不太接受。

最佳答案

简短回答:否。

长答案:

这可能取决于您在“指向字符的指针”这一措辞中的含义。它可以被严格解释为正式类型 char* 或类似或更宽松地解释为任何字符所在内存的地址。

我没有看到您提到的重载实际上存在于标准中,但是可能存在其他必需的重载。您作为示例的那个似乎不存在(并且它似乎不存在任何其他带有 std::string::iteratorchar* 重载的地方>),你不能输出一个 std::string::iterator 例如:

std::string s = "abc";
std::string.iterator p = s.begin();

std::cout << p; // fails

因为标准说方法和函数应该存在,即使我们要求实现不需要按照标准中指示的方式实际正式定义它们,而只是表现得好像它是(比较要求翻译序列)你仍然可能需要区分重载,因为你应该能够将指针指向它们(并且你需要能够知道该指针应该具有什么类型)。

例如,如果我们有一个规范说它应该表现得像定义了 void foo(long)void foo(int) 并且实现实际上只包含void foo(long) 只要程序只发出对 foo 的函数调用,它就可以正常工作,因为 shorts 会默默地转换为 int,但是一旦某些程序包含获取指向函数的指针的代码,它就会失败,因为它将存储指针的类型根本不匹配:

 void foo(long);

foo(1L); // works fine
foo(1); // works probably fine, 1 is converted to long first

void (*f)(int) = foo; // this fails as it cant convert void(*)(long) to void(*)int

从这里我们可以得出结论,std::string::iterator 可能需要是不同的正式类型(仍然如果 char* 存在重载与 std::string::iterator)。请注意,即使 char* 出现,char const* 也是一个不同的类型。

但是,如果您只是通过“指向 char 的指针”仅表示字符在内存中的地址(不一定是 char* 类型),那当然可以。人们甚至可以争辩说它很可能是。

关于c++ - `std::string::iterator` 保证不是指向 char 的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33294137/

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