2012-02-27 94 views
3

爲什麼下面的代碼在C++11中編譯並且不在C++03中? (包括gcccl爲什麼C++ 03文件流不接受字符串構造函數參數?

#include <string> 
#include <iostream> 
#include <fstream> 

int main(int argc, char* argv[]) { 
    const std::string t("Hello"); 
    std::ofstream out(t); 
} 

爲什麼不C++03流接受std::string作爲構造函數的參數? 這個決定是基於某些事情還是意外發生的?

回答

9

由於僅在C++ 11中添加了std::string的構造函數,因此在編譯嚴格符合C++ 03編譯器時代碼失敗。

至於這個問題,「是否基於某種智能」,因爲添加了界面,可以推斷沒有技術原因可以省略。

這增加了方便性,因爲如果您有std::string,您總是可以撥打.c_str()來獲得適用於舊接口的C字符串。 (如C++ 11的文件說,該走std::string構造函數有正是作爲調用對應的構造,這需要const char*與呼籲串.c_str()的結果相同的效果。)

2

他們只是簡單地忘記了在C++ 03中添加string構造函數。現在已經修復了。這一次其他的事情被遺忘了,比如make_unique。總有些事情可以做得更多。 C++ 03也忘了指定函數模板的默認參數,現在包含它們。

編輯:作爲@Charles說,這可能不是一個字面上的「遺忘」,而是它的東西,顯然應該在那裏,只是沒有被用於某種原因或其他規定。進一步的例子由std::next/std::prev給出,這是一個很大的浮雕,並且std::to_stringstd::stoi/d/ul/ull,它們仍然是非常有意義的,但是沒有人在這個時候指定它們。他們以前缺席的原因不一定很深。

+0

我不確定「忘記」是否真的合適。 Iostreams是標準庫中最古老的部分之一,第一個標準是編纂現有實踐的一大部分。正如C++所涉及的,std :: string接口更像是一個遺漏,特別是在將C++作爲一種新語言教學時。他們幫助流媒體形成整個圖書館更加一致的部分。 – 2012-02-27 22:31:32

5

我記得,這是在幾年前的clC++。m上討論的,而Andrew Koenig(我認爲它是安德魯,無論如何)都表示它實際上在一些會議中提出,但是接受一個想法string也很快與接受wstring的想法混爲一談,並且從那裏開始變成關於支持文件名中的國際化字符集的討論,並且......之後不久,整個想法被放棄了,因爲它打開了一個大罐當時沒有人準備好處理這些蠕蟲。

相關問題