declval

declval實現:

#include<type_traits>

using namespace std;

template<typename T>
typename add_rvalue_reference<T>::type declval();

declval 通常被用在一些表達式中配合c++11的新關鍵字decltype推導關係。
在實現代碼中我注意以下幾個問題:

declval()是一個沒有實現的模板函數。
typename在源代碼中做了什麼?
爲什麼要返回一個右值引用?

declval()是一個沒有實現的模板函數。
在vs2015中是允許一個模板函數或者一個函數沒有函數體。
typename在源代碼中做了什麼?
typename在這裏的意思就是,告訴編譯器::type是一個類型,而不是一個靜態成員變量。
爲什麼要返回一個右值引用?
這個我真不知道啊!!
通過我的實驗發現無論是返回一個標準類型還是右值引用都是能達到相同的效果:
代碼如下:

template<typename T>
typename T&& my();

template<typename T>
typename T my1();
decltype(true ? my<test>(): my<base>()) a;
decltype(true ? my1<test>(): my1<base>()) b;


a,b都是 base類型。

在引用摺疊的情況下:
decltype(true ? my<test&>() : my<base&>()) a1;
decltype(true ? my1<test&>() : my1<base&>()) b1;
a1,b1 均爲base&類型
當模板參數爲右值引用的情況下:
<pre name="code" class="cpp"><pre name="code" class="cpp">decltype(true ? my<test&&>() : my<base&&>()) a2;
decltype(true ? my1<test&&>() : my1<base&&>()) b2;



a2,b2均爲base類型
同時
my<test>().test1(); 
也可以不通過創建test對象而直接調用函數。

增加右值引用類型,一定會有它的原因,我只是沒學到。等我真正明白了再回來修改梳理。

····················
2017年5月24日00:18:06 
declval返回一個test&&這樣就不存在創建一個test對象。
這個文章,確實存着一些問題,這個declval是用來簡化代碼,所以我給的例子是有一定問題的。
···················
本文使用的兩個類型:

	struct base { int test1() { return 1; } };

	struct test : base {
	private:test() {};  //私有構造函數
	public:
	int test1(){ return 1; }
	};



發佈了39 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章