程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++11 最反直覺的地方

c++11 最反直覺的地方

編輯:C++入門知識

1 auto 會自動把 引用 去除掉
 
  int& get();
  auto k = get();     // k的類型是int,而不是int&
 
  Derived object;
  auto&    same_object = (Base&)object;     
  auto  another_object = (Base&)object;  //會重新構造個Base對象 
 
   
2 decltype 有時會自動把 引用 加上

  int x;
  decltype((x)) 和 decltype(*&x) 的類型是int&,而不是int
 
  在宏中使用decltype時,要特別注意別多加了括號。
 
  下面這段代碼錯在哪裡?
    template<typename T, typename R>
    auto min(T t, R r) -> decltype(t < r ? t : r)
    {
      return (t < r ? t : r);
    }
   
  decltype(t < r ? t : r)的類型是T&或R&,而不是所希望的T或R!
 
 
  標准是這樣規定的:

The type denoted by decltype(e) is defined as follows:
  — if e is an unparenthesized id-expression or an unparenthesized class member
     access (5.2.5), decltype(e) is the type of the entity named by e. If there
     is no such entity, or if e names a set of overloaded functions, the program
     is ill-formed;
  — otherwise, if e is an xvalue, decltype(e) is T&&, where T is the type of e;
  — otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;
  — otherwise, decltype(e) is the type of e.
 

3 std::move、std::forward、右值引用
 
  C++11 引入 右值引用,可以做到:函數轉發、針對臨時對象優化
  move是動詞,從字面上理解好像是要移動對象,其實std::move只是簡單的將類型轉成右值引用而已!!! 可以理解成 cast_to_rvalue_reference 或 treat_as_temporal_object。
 

  void test1(int&&) {}
 
  void test2(int&& value)  //注意:value的類型是int,而不是int&&
  {
     test1(value);    //無法編譯通過,因為value的類型是int! 必須轉換類型
     test1(static_cast<int&&>(value));      //或者
     test1(std::forward<int>(value));
  }
 
  test2函數中,value的類型是int,而不是int&&。
  這是一個不得已的選擇。如果value的類型是int&&的話,就會有副作用:
 
  void increase(int& value) { ++value; }
  void test3(int&& value) { increase(value); }
 
  char ch = 'a';
  test3(ch);  //本意是改變ch值,但實際上ch值不會改變,改變的是臨時對像
  通過轉發函數test3,increase函數可以修改臨時對像,
  這造成程序員犯的錯誤(如上面的例子),難以在編譯時就被找出來。
 
 
  std::forward<T>(value) 等價於 static_cast<T&&>(value),感覺後者更容易理解。
  std::forward 起到的轉發作用。如果T類型為 R&、 R&&,經過類型轉換後,其類型還是和原來的一樣。
  在C++11中  www.2cto.com
    R&  &   等同於 R&   (在c++03中,R& &這種寫法是非法的)
    R&& &   等同於 R&
    R&  &&  等同於 R&
    R&& &&  等同於 R&&

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved