2015-10-23 49 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<<()變體。相反,不要求不應該。這意味着它是實現定義是否在您的帖子末尾的代碼編譯。

相關問題