天天看點

《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生

從最初的代号c++0x到最終的名稱c++11,c++的第二個真正意義上的标準姗姗來遲。可以想象,這個遲來的标準必定遭遇了許多的困難,而c++标準委員會應對這些困難的種種政策,則構成新的c++語言基因,我們可以從新的c++11标準中逐一體會。而客觀上,這些基因也決定了c++11新特性的應用範疇。在本章中,我們會從設計思維和應用範疇兩個次元對所有的c++11新特性進行分類,并依據這種分類對一些特性進行簡單的介紹,進而一覽c++11的全景。

2011年11月,在印第安納州布盧明頓市,“八月印第安納大學會議”(august indiana university meeting)緩緩落下帷幕。這次會議的結束,意味着長久以來以c++0x為代号的c++11标準終于被c++标準委員會準許通過。至此,c++新标準塵埃落定。從c++98标準通過的時間開始計算,c++标準委員會,即wg21,已經為新标準工作了11年多的時間。對于一個程式設計語言标準而言,11年顯然是個非常長的時間。其間我們目睹了面向對象程式設計的盛極,也見證了泛型程式設計的風起雲湧,還見證了c++後各種新的流行程式設計語言的誕生。不過在新世紀第二個10年的伊始,c++的标準終于二次來襲。

事實上,在2003年wg21曾經送出了一份技術勘誤表(technical corrigendum,簡稱tc1)。這次修訂使得c++03這個名字已經取代了c++98成為c++11之前的最新c++标準名稱。不過由于tc1主要是對c++98标準中的漏洞進行修複,核心語言規則部分則沒有改動,是以,人們還是習慣地把兩個标準合稱為c++98/03标準。

《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生

c++11是一種新語言的開端。雖然設計c++11的目的是為了要取代c++98/03,不過相比于c++03标準,c++11則帶來了數量可觀的變化,這包括了約140個新特性,以及對c++03标準中約600個缺陷的修正。是以,從這個角度看來c++11更像是從c++98/03中孕育出的一種新語言。正如當年c++98/03為c++引入了如異常處理、模闆等許多讓人耳目一新的新特性一樣,c++11也通過大量新特性的引入,讓c++的面貌煥然一新。這些全新的特性以及相應的全新的概念,都是我們要在本書中較長的描述的。

c++0x是wg21計劃取代c++98/03的新标準代号。這個代号還是在2003年的時候取的。當時委員會樂觀地估計,新标準會在21世紀的第一個10年内完成。從當時看畢竟還有6年的時間,确實無論如何也該好了。不過2010新年鐘聲敲響的時候,wg21内部卻還在為一些諸如哪些特性該放棄,哪些特性該被削減的議題而争論。于是所有人隻好接受這個令人沮喪的事實:新标準沒能準時釋出。好在委員會成員保持着樂觀的情緒,還常常互相開玩笑說,x不是一個0到9的十進制數,而應該是一個十六進制數,我們還可以有a、b、c、d、e、f。雖然這是個玩笑,但也有點認真的意思,如果需要,wg21會再使用“額外”的6年,在2015年之前完成标準。不過衆所周知的,wg21“隻”再花了兩年時間就完成了c++11标準。

《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生

從表1-1中可以看到c++從誕生到最新通過的c++11标準的編年史。

《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生
《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生

圖1-1比較了兩個語言标準委員會(wg21,wg14)制定新标準的工作程序,其中一些重要時間點都标注了出來。

《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生

如果讀者已經學習過c++98/03,就可以發現c++98/03的設計目标如下:

《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生

這些特點使得面向對象程式設計和泛型程式設計在過去的10~20年内成為程式設計界的明星。不過從那時開始,c++的發展就不僅僅是靠學者的遠見前瞻去推動的,有時也會借由一些“奇緣”而演進。比方說,c++模闆就是這樣一個“奇緣”。它使得c++近乎成為了一種函數式程式設計語言,而且還使得c++程式員擁有了模闆元程式設計的能力。但是凡事有兩面,c++98/03中的一些較為激進的特性,比如說動态異常處理、輸出模闆,現在回顧起來則是不太需要的。當然,這是由于我們有了“後見之明”,或者由于這些特性在新情況下不再适用,又或者它們影響了c++11的新特性的設計。是以一部分這樣的特性已經被c++11棄用了。在附錄b中我們會一一列出這些棄用的特性,并分析其被棄用的原因。

而c++11的整體設計目标如下:

《深入了解C++11:C++ 11新特性解析與應用》——第1章 新标準的誕生 1.1 曙光:C++11标準的誕生

我們可以分别解釋一下。

首先,使c++成為更好的适用于系統開發及庫開發的語言,意味着标準并不隻是注重為某些特定的領域提供專業化功能,比如專門為windows開發提供設計,或者專門為數值計算提供設計。标準希望的是使c++能夠對各種系統的程式設計都作出貢獻。

其次,使得c++更易于教學,則意味着c++11修複了許多令程式員不安的語言“毒瘤”。這樣一來,c++文法顯得更加一緻化,新手使用起來也更容易上手,而且有了更好的文法保障。其實語言複雜也有複雜的好處,比如roots、dealii等一些複雜科學運算的算法,它們的作者非常喜愛泛型程式設計帶來的靈活性,于是c++語言最複雜的部分正好滿足了他們的需求。但是在這個世界上,新手總是遠多于專家。而即使是專家,也常常隻是精通自己的領域。是以語言不應該複雜到影響人們的學習。本書作者之一也是wg21中的一員,從結果上看,無論讀者怎麼看待c++11,委員會大多數人都認同c++11達成了易于教學這個目标(即使其中還存在着些看似嚴重的小缺陷)。

最後,則是語言的穩定性。經驗告訴我們,偉大的程式設計語言能夠長期存活下來的原因還是因為語言的設計突出了實用性。事實上,在标準制定過程中,委員會承擔了很多壓力,這些壓力源自于大家對加入更多語言特性的期盼—每一個人都希望将其他程式設計語言中自己喜歡的特性加入到新的c++中。對于這些熱烈而有些許盲目的期盼,委員會成員在bjarne stroustrup教授的引導下,選擇了不斷将許多無關的特性排除在外。其目的是防止c++成為一個千頭萬緒的但功能互不關聯的語言。而如同現在看到的那樣,c++11并非大而無序,相反地,許多特性可以良好地協作,進而達到“1 + 1 > 2”的效果。可以說,有了這些努力,今天的讀者才能夠使用穩定而強大的c++11,而不用擔心語言本身存在着混亂狀況甚至是沖突。

值得一提的是,雖然在取舍新語言特性方面标準委員會曾面臨過巨大壓力,但與此同時,标準委員會卻沒有收集到足夠豐富的庫的新特性。作為一種通用型語言,c++是否是成功,通常會依賴于不同領域中c++的使用情況,比如科學計算、遊戲、制造業、網絡程式設計等。在c++11通過的标準庫中,服務于各個領域的新特性确實還是太少了。是以很有可能在下一個版本的c++标準制定中,如何标準化地使用庫将成為熱門話題,标準委員會也準備好了接受來自這方面的壓力。

繼續閱讀