C++11中std::declval的實現(xiàn)機制淺析
本文主要給大家介紹了關于C++11中std::declval實現(xiàn)機制的相關內(nèi)容,分享出來供大家參考學習,下面來一起看看詳細的介紹:
在vs2013中,declval定義如下
template <_Ty> typenamea dd_rvalue_reference<_Ty>::type declval() _noexcept;
其中,add_rvalue_reference為一個traits,定義為
template <_Ty>
struct add_rvalue_reference
{
typedef _Ty&& type;
}
可見,declval被定義為一個函數(shù),并且只有申明,沒有實現(xiàn)(在gcc 版本中似乎有實現(xiàn),但是也不能在運行時調(diào)用——通過靜態(tài)斷言實現(xiàn))。那么,問題來了,為什么這樣定義呢,為什么不直接使用模板參數(shù)指定的,揣測原因如下:
通過函數(shù)返回值,實際上是等同于實例化了這個類型的一個對像,進而可以用這個對像調(diào)用成員方法,成員變量。這個方法最妙的地方在于不論類型的構造如何定義甚至有無構造都能獲得這個類型的一個對像的引用實例。
其實,也有其它方法可以得到類似的效果。
class Klass
{
public:
int m_a;
//parameter defined
//member function
}
假如有上的一個類,可以通過下面的方法引用到成員變量m_a:
((Klass*)0)->m_a;
這也是在c語言中獲取結構體成員的地址偏移量的常用技巧,但是有魔鬼數(shù)字和類型強轉,不如declval來得優(yōu)雅。
當然這一切都只能是在編譯期蹦噠。declval常和c++11新引入的decltype配合。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
c++元編程模板函數(shù)重載匹配規(guī)則示例詳解
這篇文章主要為大家介紹了c++元編程模板函數(shù)重載匹配規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
C語言實現(xiàn)輸入兩個數(shù)字將其按從小到大輸出的方法
這篇文章主要介紹了C語言實現(xiàn)輸入兩個數(shù)字將其按從小到大輸出的方法,本文通過代碼講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

