顯示廣告
隱藏 ✕
※ 本文為 xxxx9659.bbs. 轉寄自 ptt.cc 更新時間: 2013-02-06 22:10:49
看板 C_and_CPP
作者 EdisonX (卡卡獸)
標題 [分享] C++ Primer 5e , C++ 11 tutorial
時間 Fri Feb  1 03:39:57 2013



目錄 BEGIN _______________________________

零 、 前言

壹 、 基本資料型態
      (1) nullptr      < g++ , vc support >
      (2) constexpr    < g++ , vc support >
      (3) type aliases < g++ support only >
      (4) auto type    < g++ , vc support >
      (5) decltype     < g++ , vc support >

貮 、 String, Vector, Arrays
      (1) range for statement                      < g++ , vc support >
      (2) 套嵌式 template                          < g++ , vc support >
      (3) vector constructor , assign element      < g++ support only >
      (4) begin / end                              < g++ , vc support >
      (5) vector<T>::cbegin() , vector<T>::cend()  < g++, vc support >

參 、 函式 Functions
      (1) initializer_list < initializer_list parameters , g++ support only >

肆 、 類別初步
      (1) constructor , = default    < g++ support only >
      (2) class 定義時初始化成員     < g++ support only >
      (3) delegating constructors    < g++ support only >

伍 、 循序式容器
      (1) 新增 std::forward_list     < g++ , vc support >
      (2) 新增 std::array            < g++ , vc support >
      (3) std::string                < g++ , vc support >

陸 、 泛型算法
      (1) lambda 簡介                < g++ , vc support >

柒 、 其他...


目錄 END __________________________________



零 、 前言_________________________________

  雖 C++ 不熟,唯最近出現一些語法讓筆者感到十分錯愕,後來才知道不少學校及
一些業界已開始跟進 C++ 11,於是狠下心再把 C++ Primer 5e K 過一遍 ( 和 4e 差
別蠻大的,除了 C++ 11 外,編排也有些異動),做一些 note ,整理後做為分享。提
醒,真的只供 tutorial,畢竟目的是: C++ -> C++11 && Primer 4e->5e,內容比不上
C++ 11 FAQ 精彩。


  若覺得我有誤會書中之意,請不吝告知;覺得專有名詞中文翻得很爛,也請不吝指正
,使用編譯器主要為 Code::Blocks(g++ 4.6.1),VC2012,內文提供的 g++、vc,指的是
這兩種版本之編譯器。然後 STL 實在是太過於包山包海,加上還有新增新的 container
,這裡全略過,有興趣可到 C++ Reference 或相關網站查詢,STL 部份及其之

member function 相關說明均會再加註是否為 C++ 11。

壹 、 基本資料型態 < C++ Primer 5e , Chapter 02 > ______________

(1) nullptr < g++ , vc support >

    在 C language 裡一些法則會提到, 指標最好初始化設 NULL,唯 NULL 是以
macro 方式定義,在 C 裡定義成 ( (void*)0 ),C++ 定義成 0,而 C++ 11 多了
nullptr,故程式碼裡可這麼用

    int * ptr = nullptr;
    vector<int> *v = nullptr; /* v 的宣告其實不好 */

(2) constexpr < g++ , vc support >

  一變數被宣告成 constexpr 時,就必須被初始化。

  constexpr int expr = 20;
    constexpr int limit = mf+1;
  constexpr int * q   = nullptr;
 
    constexpr int new_sz() { return 42; }
    constexpr int foo = new_sz();

    值得注意的是,上述的 constexpr int foo,在編譯期時便會呼叫 new_sz(),填入
foo 裡。也由於為了 constexpr 能在編譯期時立即被展開,實際上是隱喻的使用了
inline ( 換句話說,它的作用也只是建議,不是必然 )。再換句話說,它也有著宣告
與實體沒辦法拆成 .h / .cpp 兩個檔案進行實作。

(3) type aliases < g++ support only >

    一般想要重定義一個資料型態時,早期是用 typedef 方式去做,如

  typedef unsigned char byte;
    typedef unsigned int  word;

    int add(int a, int b) {return a+b;};
    typedef int (*fptr)(int, int); // aliase declare function pointer

    C++ 11 多了 using 可用

    using byte = unsigned char;
    using word = unsigned int ;
    using fptr = int (*)(int, int); // aliase declare function pointer

    ※ vc2012 不支援 using 做 type aliase

(4) auto type < g++ , vc support >

    auto 算是我認為 C++ 11 裡對初學者的一項福音(也可能不是),以往之 C/C++
auto 主要是修飾變數之生命週期,相關章節在提到 auto 時可能還會再提到幾個識別
字:auto、static、register、extern,好一點的會再提比較冷門的識別字,如
volatile、restrict 等。

  auto 這關鍵字到 C++ 11 時,不確定是轉義(原本的用法拿掉)還是多義(兼顧
原本的用法)。使用 auto 宣告一變數時,必須給定初值,該變數之資料型態會自己
推導。如


    int i = 10;
    auto ai = i; /* ai 最後被宣告成 int */

    vector<int> v(10,0);
    auto av = v;

    for( auto itr = av.begin() ; itr!=av.end(); ++itr) /* 可用在 iterator  */
        *itr += 10;

    double d = 2.7;
    auto dvar = d + i; // double op int , 會被推成 double

  當然筆者是認為 初學階段 不要過於依賴 auto,不然很多概念會弄得亂七八糟
(這句刪除)。比較讓人感到困惑的是關於 pointer / reference 之應用。

  int  i = 0, &r = i;
    auto a = r;  // a 被推成 int , 初值就是 i 值
    auto p = &i; // p 被推成 pointer
  auto & af = i; // af 被推成 reference to int variable.
  
  另若原變數有加 const 修飾時也可另外推出來、auto 又可再加 const 加以修飾,
這個推下去過於贅述,點到為止。另再一點注意的是,auto 別拿來當 func 之引數修飾
,諸如 auto max(const auto & a ,const auto & b); 該用 template 就用 template。

(5) decltype < g++, vc support >

    C++ 11 裡,decltype 是個新的關鍵字。假設已宣告 int a; 現又欲將變數 b 宣告
得和變數 a 一樣時,這時 decltype 便可使用。

  decltype(a) b; // b 之資料型態與 a 同。

decltype 也可放 function(),將會推導出該 function 傳回值之資料型態,如

    int f1(double){return 1;} // f1 return int
    decltype(f1()) c; // c 會被宣告成 int

  上面的 decltype(f1()),實際上並不會真的去呼叫 f1 function,所以不用擔心
效率太差問題。有幾種狀況可能比較不容易想,下面列出一些

   int i=0;
  int *p = &i, &r=i;
    decltype(r + 0) b;      // 相加後還是 int , b 宣告成 int
    decltype(*p) c=i;       // c 宣告成 int& , 初值綁定在 i 上
  decltype( (what_ever) ) x; // 加兩個括號的, x 一定是 reference,故要給初值

    自然的以往使用的 std::string::size_type idx=0 也可直接以 auto 或
decltype 方式完成。故要 aliase 函式指標時就變得簡單許多。

    int add(int a, int b){return a+b;}

    typedef int (*fptr1)(int, int) ; // typedef
    using fptr2 = int (*)(int, int); // C++ 11 using aliase
    typedef decltype(add) * fptr3  ; // typedef + decltype

    fptr1 f1 = add;
    fptr2 f2 = add;
    fptr3 f3 = add;
    decltype(add) * f4 = add; // 其實小程式用這個就行,不太需要 typedef
  auto  f5 = add;           // auto 無敵 ??

  當然做 function pointer typedef 還有另一種風格,與 C++ 11 相關性不大,
這裡就不再贅述。

貮 、 String, Vector, Arrays <C++ Primer 5e , Chapter 03 > _________

(1) range for statement < g++ , vc support >

    在早期 C/C++ 裡用 for 對特定容器裡之每個元素做一段敘述時(如字串轉大寫),
寫法可能如下

        string s = "EdisonX";
        for( decltype( s.length() ) idx=0; idx!=s.length(); ++idx)
                s[idx] = toupper(s.at(idx));
        cout << s << endl;

    先小複習一下,上面的 idx 在這裡用 decltype(s.length()) 會比 auto 適當些,
原因應不用多述。且實際上並不會真的去呼叫 string::length(),只會推型別而已。
一樣的事,C++ 11 對於 for loop 可改成下面型式

        string s = "EdisonX";
        for(auto &ch : s) // 對象換成了 each ref. character ch in string s
                ch = toupper(ch);
        cout << s << endl;        

  range for 較正式的表示為

  for( declaration : expression )    for(  變數宣告  :   表達  )
    statement                             敘述

  整體用起來頗像 for_each 。注意,第二段的 auto &ch 指的就是 char &ch。所以要
算有幾個大寫、小寫字元之類的也不是問題,另這種 range for statement 也適用於一
般 array。

    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int s=0;
    for( decltype(arr[0]) ele : arr)  s+=ele;
    cout << s << endl;

  其他有興趣可再自己摸摸,它可以再配合 continue、break 。

(2) 套嵌式 template

    早期在寫 vector<vector<int>> 時,部份 compiler 會把最後的兩個連在一起的角
括號 >> 視為 shift operator >> ,所以書上會建議多一個空間做分格,變成
vector<vector<int> >,便不會發生這問題。C++ 11 已把這個納到規範去,不過注意的
是,compiler 會怎麼解讀 vector<vector<int>> 又是一回事,畢竟規範和實作(實際
implement standard 之 compiler) 從以前到現在一直都是兩回事。

(3) vector constructor , assign element < g++ support only >

    在 C++ 11 之前,vector 之 constructor 及初始化其實蠻有限的,像是它不能達
int arr[]={1,2,3,4} 這種作法,但 C++ 11 之後這行得通了,如

        vector<string> str = {"Hi","Ptt","EdisonX"};
        for(string s : str) cout << s << endl;  

  這種方式是藉由 in-class initializer 完成,換而言之,若是要搞 saw array 時
也可像下面這樣搞,

        vector<vector<int> > arr = {
                {1,2,3}, {4,5,6,7,8},
                {9,10}, {11,12,13,14,15}
        };
        arr[0] = {11,22,33}; // OK
        for(auto Row: arr) for(auto ele : Row)
                cout << ele << endl;

  上述的 auto Row, auto ele 可寫成 auto & Row, auto & ele,細節差異是
之前就知道的事,就不再贅述。值得注意的是,C++ 11 幾乎所有 container 都支
援 in-class initializer (目前還沒看到沒支援的),同時這特性也被支援到 new
身上,如下例是合法可行的。


        int * arr = new int[3] { 1, 2, 3};

但比較可惜的是,VC 2012 並沒做到這種地步,也就是 vc 2012 不支援 in-class
initializer。


(4) begin / end < g++, vc support >

  傳統初學者寫 function 時,大多有兩種方式,一種是傳 pointer + size;另一種
是 STL 設計方式,傳 begin pointer / end pointer (pointer 講成 iterator 較佳),
假設找某個 array 裡第一個出現 val 之位置時,func 與 caller 可能長得像這樣

    int * find(int * start , int * last , int val) {
        for( ; start!=last ; ++start)
           if(*start==val) return start;
        return last;
    }

    int  arr[] = {1,2,3,4,5};
    int *pos4 = find(arr, arr+5, 4); // 注意這行
    cout << *pos4;  

  主要在 caller 端,可以有其他的方式做處理,上面註解的部份換過變成如下,

    int *pos4 = find(begin(arr), end(arr), 4);

  換而言之,在求靜態陣列元素個數時,以往是習慣用 sizeof(arr)/sizeof(arr[0])
sizeof(arr) / sizeof(*arr),所以到 C++11 時多了一種選擇,

    auto arr_size = begin(arr) - end(arr);
  
  不過這裡要強調,上面不是種好的寫法,因實際傳回值是 ptrdiff_t,而非 size_t,
比較尷尬的是不能對於由 new 產生之空間做處理,下述範例便是錯誤示範。。

        int *arr = new int[5];
        for(int i=0; i<5; ++i) arr[i] = i;
        int *pos4 = find(begin(arr), end(arr), 4);    // fail

(5) vector<T>::cbegin() , vector<T>::cend()  < g++, vc support >
 
  直接看碼和註解吧。

        vector<int> v={1,2,3};     // vc2012 不支援這裡
        auto it_beg = v.cbegin() ; // vector<int>::const_iterator it_beg;
        auto it_end = v.cend();    // vector<int>::const_iterator it_end;
        while(it_beg != it_end)
            cout << *it_beg++ << endl; // 綁定對象為唯讀,可改綁定對象


參 、 函式 Functions < C++ Primer 5e, Chapter 06 >____________


(1) std::initializer_list < initializer_list parameters , g++ support only >

    C 語言裡還在使用的不定參數 - va_list(),va_start(),va_end(),va_arg(),
C++ 11 可能準備要走入歷史了。

  假設要計算輸入一串數值之總合,可用不定參數去做,不示範。而 C++ 11 多了
initializer_list 後,其實更方便,

        int sum(initializer_list<int> L)
        {
                int s = 0;
                for(auto beg = L.begin() ; beg!=L.end(); ++beg)
                        s+=*beg;
                // for(const auto & ele : L) s+=ele; // using range for method
                return s;
        }

        int rst = sum ( {1,2,3,4,5} ); // 注意這裡怎寫的
        cout << rst ;

  要做成 template 也沒問題,變成 T sum(initializer_list<T> L); 不再贅述。


肆 、 類別初步 < C++ Primer 5e, Chapter 07 >________________

(1) constructor , = default < g++ support only >

  考慮下面之 class

  class C{
            string a="a", b="b", c="c"; // c++ 11 support
        public:
            C(string a, string b , string c) : a(a), b(b), c(c) {}
          C() = default;
    };

  裡面的 C() = default ; ,乃由於已有第一種版本 ctor (三個 string),想要
相容於無引數之 ctor,故直接寫下 C() = default,讓編譯器可接受且自動產生,無
引數之 ctor。

(2) class 定義時初始化成員 < g++ support only >

    上述例子裡,在早期的編譯器沒辦法直接在為 class 定義時,便給變數初始值,
諸如上頭之 string a, b, c 都做了這種事(除了靜態 const 整數資料可能除外),
但在 C++ 11 裡面,允許這麼做,當寫下 C obj; 時,obj 裡之 string a, b, c 都將
被初始化完畢。 

(3) 委派建構子 < delegating constructors , g++ support only >

    早期之編譯器,ctor 可以呼叫任何 member function,就只有其他之 ctor 與 dtor
不可呼叫。C++ 11 在 ctor 初始列時可用委派方式呼叫其他 ctor,下列為一範例,

class String{
private:
        char *buf;
        size_t length, capacity;
public:
        String() : buf(nullptr), length(0), capacity(0){}
        String(const char * str) : String() { /* whatever */ }
};

  當然也可以將 String() 委派給 String(const char *),不再示範。另外
constructor 也可加上 constexpr 做修飾,這裡不再深入。


伍、循序式容器 < Sequence Container ,  C++ Primer 5e, Chapter 09 >______


(1) 新增 std::forward_list < g++ , vc support > 

  使用前引入 #include <forward_list> ,實作之資料結構為 single link list,
std::list 裡之所有尾端操作都不支援。

(2) 新增 std::array < g++ , vc support >

    使用前引入 #include <array>,大小為固定,不支援 remove, resize。

(3) std::string < g++ , vc support >

    早期用字串數值轉換全都是用 istringstream、ostringstream,C++ 11 多了一系
列函式專做這事情,包含 to_string, stoi, stol, stoul, stoull, stof, stod,
stold,整個和 C-style 很像 (atoi / stoi, a 換成 s 而已)。


陸、泛型算法 < Generic Algorithms , C++ Primer 5e , Chapter 10 >_____

(1) lambda 簡介 < introducting lambdas >

  這功能大概是 C++ 11 最神奇進展之一 < 講白了是給一個 non-name function ? >
。lambda 標準之型式如下

    [capture list] (parameter list) -> return type { function body }
        [   捕獲列   ] (   參數列     ) ->   傳回值    {   函式內容    }

    其中 參數列 與 傳回值 可略,但 capature list 與 函式內容 不能略,看起來很亂
,不過這標準型式大概是要熟記的東西,不然後面的也玩不下去。直接看例子

        auto f = [] {return 10;}; // 建立一個可呼叫物件,傳回 10
        cout << f() << endl; // 輸出 10

    上述之 auto f 就省掉了 parameter list 與 return type,寫完整的話如下

        auto f = [](void) -> int {return 10;};

    一個簡單的應用,假設要調用 algorithm 裡之 sort 對 struct 做排序時,舊式寫
法大概如下

        struct Num{ int n;};
        bool compare (const Num & a, const Num & b){return a.n < b.n;}

        Num arr[] = { {5}, {2}, {1}, {3} };
        sort(arr, arr+4, compare);
        for(size_t i=0; i<4 ; ++i) cout << arr[i].n << ' ';

  裡面的 compare function,便可以 lambda 示之,如下。

        Num arr[] = { {5}, {2}, {1}, {3} };
        sort(
              begin(arr), end(arr),
              [](const Num & a, const Num & b)
              -> bool { return a.n < b.n;}
        );

        for_each(
            begin(arr), end(arr),
            [](const Num & num)
            ->void {cout << num.n << ' ';}
        );                

  上面紅色部份 ( -> bool , -> void ) 都是可省略的。由於 lambda 實在是可以
出一本書,這篇文章就點到這裡為止,Lambda Capture List 被我全跳光了,其他有興
趣可再找額外書籍或文章補充,C++ Primer 5e 放在 10-3。


柒、其他..._________________________________

  
    這篇暫時到這裡,主要是後半段蠻長一大段時間是在講 STL library 的東西,筆者
認為直接到 C++ reference K 過一遍比在這裡看文章有效率多了。

  另 OO 部份範例碼都過長,決定全都拿掉(疑!那怎麼這篇好像變得都講垃圾話了)
,但 rvalue 概念在 class OO 裡又是新的東西,C++ Primer 5e, Ch13 蠻長篇幅在討論
這個。另個人認為版上是有篇文章必讀便是



     #19gioP8j (C_and_CPP)
     作者  yoco315 (眠月)
     標題  [翻譯] Rvalue References: C++0x Features in VC10, Part 2


  結論是,雖 C++ Primer 4e 真的寫的不錯,不過個人目前讀 5e 到 Ch15 ,其實編
排感覺比以前好些,雖有些範例和以前相仿,不過有些有改成 C++ 11 語法方式撰寫,
手邊若有 4e ,經濟許可的話收個 5e 應不會後悔。


  本文敘述至此,講得太淺請海函,有誤也請不吝指正,謝謝各位收聽。

--

~ 這輩子與神手無緣

      我只好當神獸了 ~
                                 卡卡獸

--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161

prismwu:先推之後慢慢看1F 02/01 04:35
CHeagleeye:E大必推!讚!2F 02/01 04:57
karaokstar:推薦這篇文章3F 02/01 05:16
descent:感謝分享4F 02/01 08:11
maerdimer:推!!!!5F 02/01 09:38
loveme00835:應該優先使用auto除非你想要轉型6F 02/01 10:01
johnny94:全部看完了~推!7F 02/01 10:02
kiedveian:先推再看~8F 02/01 10:05
loveme00835:詳細說明 http://ppt.cc/J7yO9F 02/01 10:06
loveme00835:另外還有 universal reference 這個新"概念" 需要跟10F 02/01 10:09
loveme00835:auto&&, T&&(template) 一起學習
loveme00835:http://ppt.cc/4-p~
C++ and Beyond 2012: Scott Meyers - Universal References in C++11 | Going Deep | Channel 9
[圖]
Scott Meyers presents "Universal References in C&#43;&#43;11". This was filmed at&nbsp;C&#43;&#43; and Beyond 2012. This is the full session in all of its splendor. Huge thanks to Scott for ...
 
loveme00835:想試試新的feature又沒辦法這麼快取得新編譯器13F 02/01 10:35
loveme00835:可以參考這裡 http://ppt.cc/sVrp

    對,這一大段都是在 Primer 5e Part III 講的,ch13 講最多,其中一項
    標題就變成了 The Rule of Three/Five ,照本宣科實在是太長了。

purpose:只看到三分之一,寫得不錯,建議加個目錄,感謝分享15F 02/01 10:42

    已補上,謝謝 p 大建議 :)

coolcomm:現在在學C++ 面臨了4e中文版和5e英文版的抉擇T^T16F 02/01 10:52

    別猶豫了,買 5e 就對了,編排 5e 比 4e 佳,還多了幾個有趣的例子。
    4e 中文版我看到後面受不了,回來翻英文,看得比較順。

wangm4a1:推17F 02/01 10:57
kiedveian:請問一下, 參(1) 的範例 vc2010 過不了18F 02/01 11:34
kiedveian:是不是因為 貳(3) 的關係?

    VC 2010 我沒再試過,但照您所述,可能是 VC2010 沒 support
    std::initializer_list。 VC 系列之前就據聞對 C++ 11 之支援性很慢,所以
    拿最新的VC2012 來測。

DJWS:to coolcomm, 5/e中文版已經出版了啊~20F 02/01 11:56
coolcomm:那是Plus版吧@_@ Plus好像是到6/e才有C++1121F 02/01 12:15
VictorTom:推:)22F 02/01 12:20
diabloevagto:先推在看23F 02/01 12:31
legnaleurc:@kiedveian 因為原PO測的版本是 VC1124F 02/01 16:59
POSIX:娘子啊!快出來看神蹟啊!25F 02/01 17:42
cutekid:推(Y)26F 02/01 18:25
nowar100:Push27F 02/01 19:05
suhorng:推 lambda超棒~28F 02/01 19:38
kiedveian:我用VS2012連initializer_list這個檔案都找不到……29F 02/01 21:08

    抱歉,剛再拿 vc 來測,發現應是當時紀錄時紀錄錯了,目前 vc 的確沒支援這裡;
    然後你說的 vc11 連 header 都沒找到,是因當時在 vc11 規劃時就準備拿掉它,詳
    情可看這篇連結  http://ppt.cc/4XG8
    另補上 vc11 對於 C++ 11 之支援  http://ppt.cc/lIAw

    然後我也在找 vc 有沒有 c++ 11 feture extend package 之類的東西,不過目前
    看似沒有 ( 不過也不意外, M$ 大概把精力大多放在自家產品上了吧 )。

DJWS:對不起是我搞錯了 orz30F 02/02 09:21
tom5xavier:大大你好小弟是C++新手 只修過一學期的大學部課程31F 02/02 11:08
tom5xavier:想請大大推薦一本適合重學讀的 中文版猶佳
tom5xavier:如果中文版大大覺得都沒有翻很好的 英文版也可以
wch6858:推34F 02/02 11:35
EdisonX:@ tom~ : 目前建議挑有 C++11 的書籍,所以不可能挑中文書35F 02/02 11:43
uranusjr:套崁 -> 套嵌(ㄑㄧㄢ)36F 02/02 18:26
            已修正,謝謝 :)
amozartea:我覺得auto那個最好不要用  到時浮點取整啥的不容易偵錯37F 02/03 00:09
amozartea:那個等到很長的template type再用...
amozartea:看到的感覺是:強烈建議新手忘記有auto...
FAITHY:先推一個 大大人太好了 感謝~40F 02/03 00:20
legnaleurc:不同意 auto 那一段,不然不適合寫動態分型的語言41F 02/03 07:43
adxis:M$ 的話有一個 CTP 版的 http://tinyurl.com/c2yyqr842F 02/03 16:19
adxis:支援 Variadic templates 等
EdisonX:auto 有句話我覺得我說的比較不切意,所以用灰色拿掉.44F 02/03 17:15
a27417332:auto舊義似乎已經刪除了,改為自動型態的樣子45F 02/03 18:11
a27417332:然後auto不能當參數這點希望可以說得明顯一點@@
privatewind:我個人是大量的使用decltype在function parameter47F 02/04 12:49
privatewind:在range-for loop則大量用auto
privatewind:基本上 能用decltype我就會用... 我覺得還蠻直觀的
privatewind:另外 文中 decltype(di) ddi = di; // ddi 宣告成int&
privatewind:應該是寫錯?? O.O 應該是int ?!

    這裡是我眼花,誤會了書中範例的意思,(5e,2.5.3),相關示例已拿除,謝謝指正。
    然後建不建議使用 auto 的議題我想可以先停下來了,對有經驗老手而言很方便,對
新手而言我比較擔心用慣了之後,STL 的 type 都不想去注意,也不注意一些資料轉型所
帶來的副作用。除了數值相關問題,auto 對老手確實是一大福音。
※ 編輯: EdisonX         來自: 180.177.76.161       (02/04 15:36)
SPower:thanks52F 02/04 16:09
azureblaze:不然vector<map<A, B, bool(*)(A,A)> >::iterator it =53F 02/04 17:14
azureblaze:這種東西就算typedef了一堆也超麻煩的XD
azureblaze:auto和lambda算是我換c++11最大的誘因
privatewind:話說delctype是preprocessor處理的嗎? 雖然沒有#56F 02/04 18:34
privatewind:因為IDE對decltype可以進行解析 對auto就不能了...
suhorng:不可能是preprocessor處理的吧  compiler在做的58F 02/04 18:38
azureblaze:我的小蕃茄可以做auto,decltype反而不行(版本有點舊)59F 02/04 18:52
azureblaze:至於Intellisense...他從來沒好過XD
xxxx9659:讚讚!!61F 02/06 21:37

--
※ 看板: xxxx9659 文章推薦值: 0 目前人氣: 0 累積人氣: 198 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇