C 中,auto 關鍵字

2021-10-07 07:45:51 字數 2178 閱讀 7265

在函式返回值/range-for 等情況中

1auto使用5種用法

auto :拷貝

auto& :左值引用,只能接左值(和常量右值)

auto&& :萬能引用,能接左值和右值

const auto& :const 萬能引用,能接左值和右值

const auto&& :常量右值引用,只能接右值

很多人直接就寫成 auto&&,但盡量分場景使用

auto:用於你想修改右值的情形

auto&:用於你想修改左值的情形

auto&&:用於泛型程式設計中的**

const auto&:用於唯讀

const auto&&:基本沒用,基本可被 const auto& 替代(比 const auto& 多乙個語義:一定得是右值。然而這沒什麼用,因為你都不對其進行修改,是左還是右沒什麼影響)

2、返回值自動推導,增強模板的泛型能力

//c++11

template

auto sum(t1&& x, t2&& y) -> decltype(x + y)

// c++14:

template

auto sum(t1&& x, t2&& y)

3、泛型lambda

// c++14;

auto mul = (const auto x, const auto y) ;

4decltypeauto)推導保留cv:

// c++14;

template

decltype(auto) accessvector(t&& c, i i)   // 返回 int&;

int main(int argc, char** ar**) ;

accessvector(v, 0) = 10000;

std::cout << v.at(0) << std::endl;  // 10000;

return 0;

}5、做perfect forwarding中對{}表示式的中轉

void foo(std::vectorv)

}template

void forwardfunc(arg&& ...args)

int main(int argc, char** ar**) ;

forwardfunc(il);

return 0;   

}6、簡化函式指標寫法

int(*(*foo)())() {};

auto

foo() -> auto (*)() ->

int(*)() {}; 

// 與上述等價;

需要注意的幾個坑

1、stl **型別導致 auto 可能推導出並非自己想要的型別:

// 主要源於 std::vector 在儲存布林元素時的特殊方式;

int main(int argc, char** ar**) ;

auto x = v.at(0);  // std::vector::reference, not bool;

return 0;

}2、auto 在推導 list initialization 表示式時的預設型別(std::initializer_list)

int main(int argc, char** ar**) ;  // std::initializer_list;}

c 中的auto關鍵字

auto等同於c 的var。從其初始表示式推斷宣告的變數的型別。用於編譯器已宣告變數的初始化表示式,或使用lambda表示式引數來推導。除非確實需要使用轉換,否則都需要用auto。它擁有可靠性 效能 不進行任何轉換 可用性 拼寫錯誤 效率 量 需要注意的是auto只代表型別或類,無法代表指標 引用等...

auto關鍵字 decltype關鍵字

自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...

C 之auto關鍵字

在那些情況下要申明型別 定義變數型別 函式返回值,函式引數 表示式返回變數型別 為什麼auto 在開發實踐中,有時候我們並不能非常容易地確定乙個變數應該具有的資料型別。比如,將某個複雜表示式作為初始值賦值給乙個新定義的變數時,我們往往很難確定這個表示式的資料型別,從而無法確定變數應有的資料型別。為了...