auto 讓編譯器根據初始化表達式推導變量類型。必須初始化,否則編譯錯誤。
auto x = 42; // int
auto p = &x; // int*
auto& r = x; // int&
const auto& cr = x; // const int&
int& r = x; auto a = r; // a 是 intconst int ci = 0; auto b = ci; // b 是 intconst int* p = &ci; auto c = p; // c 是 const int*const auto d = ci; // const int
auto& e = ci; // const int&
const auto& f = 42; // const int& 綁定字面值
auto x = 1, *p = &x, **pp = &p; // 正確:全是 int 相關
auto a = 1, b = 2.0; // 錯誤:int vs double
| 場景 | 傳統寫法 | auto 寫法 | 優勢 |
|---|---|---|---|
| 迭代器 | map | auto it = m.begin(); | 簡潔、不易拼錯 |
| 範圍 for | for (vector | for (auto& x : v) | 自動推導元素類型 |
| lambda 返回 | 需手寫尾置返回類型 | auto f = [](int x){ return x*2; }; | 自動推導閉包類型 |
| new 表達式 | int* p = new int(42); | auto p = new auto(42); | 類型與初始值一致 |
// C++11
template
auto add(T&& t, U&& u) -> decltype(forward(t) + forward(u)) {
return forward(t) + forward(u);
}
// C++14 更簡潔
template
decltype(auto) add(T&& t, U&& u) {
return forward(t) + forward(u);
}
auto a = {1,2,3}; 推導為 std::initializer_list,而非 vector 或數組。int& r = x; auto y = r; y = 10; // x 變為 10 —— 這是值拷貝,非綁定。auto& z = r; 才是真正的引用。auto 是現代 C++ 的基石特性: