C++有新標準,叫做C++0x


轉貼而已,個人完全對這個【東西】沒有認識。

這是什麼?

(Edited from http://kheresy.wordpress.com/2010/04/19/c-%E8%AA%9E%E6%B3%95%E5%86%8D%E5%8A%A0%E5%BC%B7%EF%BC%9Ac0x/)

  • 目前一般所使用的 C++ 語法標準,實際上大部分應該都是俗稱 C++98 或 C++03 的 ISO/IEC 14882:1998、ISO/IEC 14882:2003
  • 其中 C++03 主要是針對 C++98 做部分修正,變化並不大(微軟 VC++ team 的 說法:C++03 只是 C++98 的「Service pack」)。
  • 那 C++ 有打算再有追加新功能嗎?實際上,目前也有還在規畫中、沒有正式定案的 C++0x 草案了!(詳細可以參考維基百科上的 C++ / C++0x 的條目)
  • 而隨著新版 GCC(4.4/4.5)和 VisualStudio 2010 的推出,程式開發者也可以開始使用 C++0x 裡的部分新功能了!不過由於實際上 C++0x 是還沒正式定案的標準,所以其實不管是最新的 GCC 或 Visual C++ 2010,也都還沒有能完全支援 C++0x 的全部功能;實際上 C++0x 的規格也還在變動中,像 concepts 就被廢掉了。
  • Heresy 這一篇,主要會是以 Microsoft Visual C++ 2010 為主,介紹一些新的 C++0x 的語法;而 GCC 不同版本對 C++0x 的支援性,則建議可以參考官方的《C++0x Support in GCC》一文(用 g++ 編譯時需加上「-std=c++0x」這個參數)。
  • 以 Visual C++ 2010 來說,他的新功能可以參考《What’s New in Visual C++ 2010》,而 C++0x  的部分則可以參考 VC++ 的 team blog 的《C++0x Core Language Features In VC10: The Table》一文

VC++ 2010 的 C++0x 的新功能主要包括了六部份:

  1. auto:《C++0x: auto 和 decltype》[MSDN]
    • 自動根據 initialization expression 來判斷變數的型別,可以用來簡化較複雜的型別的變數的宣告;另外,也可以搭配新的 decltype 和 lambda expression 來做更多的應用。
    • 下面就是一個簡單的範例。在編寫程式的時候,如果直接用「auto」來取代「map<int,list<string>>::iterator」的話,就可以少打不少字。
      map<int,list<string>>::iterator i = m.begin();
      auto i = m.begin();
  2. decltype:《C++0x: auto 和 decltype》[MSDN]
    • decltype 是用來指定變數的型別的(Type Specifier),不過他所宣告的變數型別則是根據現有的變數、或是函式來做判斷。而如果搭配 auto 使用的話,可以更方便地編寫 template function。
    • 下方是一個簡單的範例,透過這樣的 decltype 寫法,可以宣告出一個和 a 同型別的變數 b。
      int a;
      decltype( a ) b;
  3. Lambda Expressions:《C++0x:Lambda expression》[MSDN]
    • Lambda expression 基本上算是「匿名函式 (anonymous function)」,他可以快速地建立一個沒有名稱的 function object,避免掉 function object 要定義出一個 class/struct 的繁瑣工作。
    • 他的語法可以參考《Lambda Expression Syntax》一文,而他比較基本的形式大致會是像下方的樣子;他傳入的參數是一個 int、而回傳值的型別(-> int)也是 int:
      [] ( int x ) -> int
      {
        return x * x;
      }
    • 下方是一個在使用 for_each() 時,使用 lambda expression 和 function object 的對照;在這種情況下使用 lambda expression 的話,程式碼可以簡化許多(不用定義出 LambdaFunctor 這個 class):
      • 使用 function object
        class LambdaFunctor
        {
        public:
          void operator()(int n) const {
            cout << n << " ";
          }
        };
        int main() {
          vector<int> v;
          for( int i = 0; i < 10; ++i )
            v.push_back(i);
          for_each( v.begin(), v.end(), LambdaFunctor() );
          cout << endl;
        }
      • 使用 lambda expression
        int main() {
          vector<int> v;
          for (int i = 0; i < 10; ++i)
            v.push_back(i);
          for_each(v.begin(), v.end(), [](int n) { cout << n << " "; });
          cout << endl;
        }
  4. Rvalue Reference:[MSDN]
  5. static_assert:《C++0x:static_assert 和 nullptr》[MSDN]
    • 這個功能可以讓編譯器在編譯時取做一些條件判斷,並且讓編譯失敗、並且顯示自定義的錯誤訊息。
    • 下面是一個簡單的範例:
      static_assert( sizeof(void *) == 4, "64bit is not supported.");
  6. nullptr:《C++0x:static_assert 和 nullptr》[MSDN]
    • nullptr 是一個新的關鍵字,用來代表 NULL 指標的值;而本來在 C++03 / C99 裡,這個角色是由 0 來做的(NULL 實際上是 define 成 0 的 macro),但是這樣的缺點是無法區分 0 和 NULL 指標,在有的時後會產生 overloaded function 無法判斷的問題。所以在 C++0x 裡另外定義了 nullptr,來和 0 做區隔。

這個應該是C++ Language的更新:

One function of the C++ committee is the development of the language core. The presentation date of C++0x depends on the progress of this part of the standard.

Areas of the core language that will be significantly improved include multithreading support, generic programming support, uniform initialization, and performance enhancements.

For the purposes of this article, core language features and changes are grouped into 4 general sections: run-time performance enhancements, build-time performance enhancements, usability enhancements, and new functionality. Some features could fall into multiple groups, but they will only be mentioned in the group which primarily represents that feature.

維基鏈接:

塗牆

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s