C++11新特性:關(guān)于auto:{int i = 8; int& j = i; auto m = j;}請問m是什么類型?
auto其實不算一個新的關(guān)鍵字,只不過它的老的含義現(xiàn)在已經(jīng)失去了意義。
舊版 auto 的含義
在C語言和C++98/C++03標準中,auto是一個存儲類別說明符,用于顯式地聲明一個變量具有自動存儲期。這意味著變量是在進入其作用域時創(chuàng)建,并在離開該作用域時銷毀。這是大多數(shù)局部變量默認的行為,因此很少有人會顯式地使用auto來聲明變量,因為它幾乎總是多余的。
例如:
void function() {
auto int x = 10; // 自動存儲期,實際上等價于 int x = 10;
// ...
}
在這個例子中,x 是一個具有自動存儲期的局部變量。但是,因為所有局部變量默認都是自動存儲期的,所以這里的auto關(guān)鍵字是可選且冗余的。
C++11 及以后版本中的 auto
從C++11開始,auto的語義被完全改變,成為了一種類型推導機制。它允許編譯器根據(jù)初始化表達式的類型自動推斷變量的類型。這使得代碼更加簡潔,尤其是在處理復雜類型(如模板或迭代器)時。
例如:
std::vector<int> vec = {1, 2, 3};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
在這里,auto讓編譯器推斷出it的類型應該是std::vector<int>::iterator,從而避免了顯式寫出這個較長的類型名。
我們再看題目中提到的問題:
int i = 8;
int& j = i;
auto m = j;
j是 int& 類型,那么m是什么類型呢?也是int&類型嗎?
答案是:m在這里是int類型而不是int& 引用類型。
auto不會保留引用特性。也就是說,auto會將j解引用,得到它所指向的實際對象的類型。
我們代碼實際操作驗證一下:
修改后再實驗:
輸出還是int類型,這是怎么回事呢?
typeid(decltype(m)).name() 返回的類型名可能不是特別直觀,因為它依賴于編譯器的具體實現(xiàn)。不同的編譯器可能會以不同的格式返回類型名。例如,在某些編譯器中,int 類型可能顯示為 i,引用類型可能帶有額外的修飾符(如 R 表示引用)。如果需要更可讀的輸出,可能需要自己解析這些符號,或者僅在調(diào)試和開發(fā)過程中使用它們。
為了更明確地確認 m 的類型是否為 int&,可以使用類型特征(type traits)來檢查。例如:
int i = 8;
int& j = i;
auto m = j;
std::cout << "Type: " << typeid(decltype(j)).name() << std::endl;
if (std::is_same<decltype(m), int&>::value) {
std::cout << "m is of type int&" << std::endl;
}
else {
std::cout << "m is not of type int&" << std::endl;
}
運行:
修改后:
int i = 8;
int& j = i;
auto& m = j;
std::cout << "Type: " << typeid(decltype(j)).name() << std::endl;
if (std::is_same<decltype(m), int&>::value) {
std::cout << "m is of type int&" << std::endl;
}
else {
std::cout << "m is not of type int&" << std::endl;
}
輸出:
圖片
這種方法可以在編譯時進行類型檢查,并且不會依賴于編譯器的具體實現(xiàn)。
通過上面的測試可以得到:不加引用,m在這里是int類型而不是int& 引用類型,auto不會保留引用特性。
還有同樣的 auto也不會保留const特性。
int main()
{
const int i = 9;
auto j = i;
if (std::is_same<decltype(j), const int>::value) {
std::cout << "j is of type const int" << std::endl;
}
else {
std::cout << "j is not of type const int" << std::endl;
}
return 0;
}
運行輸出:
圖片
總結(jié):
auto不會保留引用特性。
auto不會保留const特性。