1. 程式人生 > 其它 >C++11 auto 和 decltype 的區別

C++11 auto 和 decltype 的區別

1.auto

我們在宣告一個變數時,需要預先知道我們要宣告的變數是什麼型別,但有的變數型別是比較長,比較難以書寫,或有的時候比較困難推演出表示式的型別,特別是在泛型模板程式設計中的時候。
所以 C++11 就引入了 auto 型別說明符,讓編譯器去分析表示式所屬的型別,因為編譯器需要推算表示式的型別,所以在使用 auto 的時候,必須要給它一個初始值!不然編譯器不知道如何去推算
例如:

int i = 0;    // i 為 int
auto a = 10;  // a 為 int
auto b = i;   // b 為 int
auto c;       // 錯誤,沒有初始值

2.decltype

基於 auto ,有時候我們想知道從表示式中推算出要定義的變數型別,但是又不想用該表示式的值作為初始化。這怎麼辦呢
為滿足這要求,C++11 引入了第二個型別說明符 decltype !
decltype 的作用是選擇並返回運算元的資料型別。
例如:

#include <iostream>
using namespace std;

// 測試函式
double Fun(int &a, int &b)
{
	return 0;
}

// 主函式
int main()
{	
	int x = 0;
	int y = 0;	
	decltype(0) a = 0;     // a 是 int
	decltype(x) b = 0;     // b 是 int
	decltype(Fun(x, y)) c; // c 是 double且非必要初始化  
	return 0;
}

3.auto 和 decltype 不同點

auto 和 decltype 功能類似,但有也一些不同的地方

#include <iostream>
using namespace std;

// 主函式
int main()
{	
	const int const_value = 10;               // const int
	const int &const_value1 = const_value;    // const int&

	int value = 10;        // int
	int &value2 = value;   // int&
	int *value3 = &value;  // int*

	// 測試1
	auto A1 = const_value;          // A1 為 int,auto 忽略了頂級const
	decltype(const_value) B1 = 0;   // B1 為 const int

	// 測試2
	auto A2 = const_value1;         // A2 為 int,auto 忽略了頂級const和引用
	decltype(const_value1) B2 = A1; // B2 為 const int&

	// 測試3
	auto A3 = value;				// A3 為 int
	decltype(value) B3;				// B3 為 int

	// 測試4
	auto A4 = value2;               // A4 為 int,auto 忽略了引用
	decltype(value2) B4 = value;    // B4 為 int&

	// 測試5
	auto A5 = *value3;			    // A5 為解引用後 int 型別
	decltype(*value3) B5 = value;   // A5 為 int&

	return 0;
}

以上可看出 auto 和 decltype 的區別在於 const 和非 const 與引用和非引用的區別
1.auto 會忽略頂級 const
2.auto 會忽略引用
3.auto 在表示式為解引用時,會返回解引用型別
4.decltype 在表示式為解引用時,會返回引用型別

另外:declptye 還有個特別注意的地方

注意1

declptye((exp)) : 恆定返回引用型別!
declptye(exp) : 只有 exp 是引用型別,才返回引用型別

注意2

看以下程式碼

#include <iostream>
using namespace std;

int Fun(int& a, int& b)
{
	a = 0;
	b = 0;
	return 0;
}

// 主函式
int main()
{	
	int a = 5; int b = 3;

	decltype(Fun(a, b)) B;
	cout << "decltype 推算後 a 和 b 的值:\t a=" << a << ", b=" << b << endl;

	auto A = Fun(a, b);
	cout << "auto 推算後 a 和 b 的值:\t a=" << a << ", b=" << b << endl;

	return 0;
}


除錯結果:

可以看到,decltype 是不會去執行 Fun 函式的,它就只會做型別的推算

4._End

苦做舟

本文來自部落格園,作者:拾荒荒,轉載請註明原文連結:https://www.cnblogs.com/lvvou/p/15684727.html