2015-10-23 45 views
3

鉴于的operator<<std::ostream用于指针的过载到char存在,并考虑到该标准规定了std::string类的简介是以下内容,在§21.4:`std :: string :: iterator`保证不是指向char的指针吗?

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; 
    [...] 
    }; 
} 

最后鉴于要求为iteratorconst_iterator用于Container概念是,在§23.2/ 4:

enter image description here

和一个指向char会满足他们;我是否正确地阅读它,它的实现定义是否编译下面的代码?

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

在一个侧面说明,无论是GCCClang似乎无法接受。

+2

它不是** _implementation defined_:执行是_not_所需的文件迭代器的类型。但是,实现是_allowed_使用类或指针类型。 –

+2

@DietmarKühl如果迭代器的类型不是实现定义的,那么为什么在'basic_string'的大纲中标记为“* implementation-defined *”? – Shoe

+0

根据您在帖子中已经描述的内容,我会在帖子中对您的问题说“是”,对标题中的问题说“不”。 –

回答

0

简短的回答:第

龙答:

这可能取决于你把什么措辞“字符指针”。它可以严格地解释为正式类型char*或类似或更松散,因为任何地址都是字符所在的内存地址。

我没有看到您提到的重载实际上存在于标准中,但仍有可能存在其他所需的重载。你需要为例子中的一个似乎不存在(它似乎并没有被任何其他地方有过载与std::string::iterator VS char*),你不能例如输出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,因空头会默默地为转换为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*),它当然可以。人们甚至可以争辩说它可能很有可能。

+0

对不起,你的答案(第一段,最后一段和第三段的后半段)关于我说“指向char的指针”而不是“指向const char的指针”的一半? – Shoe

+0

@Jefffrey不,它是“指向char的指针”和“char *”之间的可能区别,前者可以更加自由地解释,正如我在上一节中讨论的。 – skyking

+0

为什么重载是否是char *',指向char或CharT const *的指针(给定类型名称CharT)?对我来说,它看起来不相关,所以请随时编辑我的问题它更清楚地知道哪个超载可以通过传递char *来获得,如果这对你很重要的话。 – Shoe

0

std::string的迭代器的(实际)类型是实现定义的。没有要求它们是指针,也不要求它们不是指针。

也不要求标准流具有接受来自任何标准容器(包括std::string)的迭代器的operator<<()变体。相反,不要求不应该。这意味着它是实现定义是否在您的帖子末尾的代码编译。

相关问题