C++11中std::declval的實(shí)現(xiàn)機(jī)制淺析
本文主要給大家介紹了關(guān)于C++11中std::declval實(shí)現(xiàn)機(jī)制的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面來一起看看詳細(xì)的介紹:
在vs2013中,declval定義如下
template <_Ty> typenamea dd_rvalue_reference<_Ty>::type declval() _noexcept;
其中,add_rvalue_reference
為一個(gè)traits,定義為
template <_Ty> struct add_rvalue_reference { typedef _Ty&& type; }
可見,declval被定義為一個(gè)函數(shù),并且只有申明,沒有實(shí)現(xiàn)(在gcc 版本中似乎有實(shí)現(xiàn),但是也不能在運(yùn)行時(shí)調(diào)用——通過靜態(tài)斷言實(shí)現(xiàn))。那么,問題來了,為什么這樣定義呢,為什么不直接使用模板參數(shù)指定的,揣測原因如下:
通過函數(shù)返回值,實(shí)際上是等同于實(shí)例化了這個(gè)類型的一個(gè)對像,進(jìn)而可以用這個(gè)對像調(diào)用成員方法,成員變量。這個(gè)方法最妙的地方在于不論類型的構(gòu)造如何定義甚至有無構(gòu)造都能獲得這個(gè)類型的一個(gè)對像的引用實(shí)例。
其實(shí),也有其它方法可以得到類似的效果。
class Klass { public: int m_a; //parameter defined //member function }
假如有上的一個(gè)類,可以通過下面的方法引用到成員變量m_a:
((Klass*)0)->m_a;
這也是在c語言中獲取結(jié)構(gòu)體成員的地址偏移量的常用技巧,但是有魔鬼數(shù)字和類型強(qiáng)轉(zhuǎn),不如declval來得優(yōu)雅。
當(dāng)然這一切都只能是在編譯期蹦噠。declval常和c++11新引入的decltype配合。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
C++利用容器查找重復(fù)列功能實(shí)現(xiàn)
本文將詳細(xì)介紹c++容器簡介,c++容器的比較 與操作實(shí)例,需要了解更多的朋友可以參考下2012-11-11Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01