C++ decltype 說明符
1.語法
decltype
( 實(shí)體 )?(1)?(C++11 起)
decltype
( 表達(dá)式 )?(2)?(C++11 起)
解釋:
1) 如果實(shí)參是沒有括號的標(biāo)識表達(dá)式或沒有括號的類成員訪問表達(dá)式,那么 decltype
產(chǎn)生以該表達(dá)式命名的實(shí)體的類型。如果沒有這種實(shí)體或該實(shí)參指名了一組重載函數(shù),那么程序非良構(gòu)。
- 如果實(shí)參是指名某個結(jié)構(gòu)化綁定的沒有括號的標(biāo)識表達(dá)式,那么
decltype
產(chǎn)生其被引用類型(在關(guān)于結(jié)構(gòu)化綁定聲明的說明中有所描述)。
- 如果實(shí)參是指名某個非類型模板形參的沒有括號的標(biāo)識表達(dá)式,那么
decltype
生成該模板形參的類型(當(dāng)該模板形參以占位符類型聲明時,類型會先進(jìn)行任何所需的類型推導(dǎo))。
2) 如果實(shí)參是其他類型為 T 的任何表達(dá)式,且
- 如果 表達(dá)式 的值類別是亡值,將會
decltype
產(chǎn)生 T&&; - 如果 表達(dá)式 的值類別是左值,將會
decltype
產(chǎn)生 T&; - 如果 表達(dá)式 的值類別是純右值,將會
decltype
產(chǎn)生 T。
如果 表達(dá)式 是返回類類型純右值的函數(shù)調(diào)用,或是右操作數(shù)為這種函數(shù)調(diào)用的逗號表達(dá)式,那么不會對該純右值引入臨時量。
如果 表達(dá)式 是除了(可帶括號的)立即調(diào)用以外的 (C++20 起)純右值,那么不會從該純右值實(shí)質(zhì)化臨時對象:即這種純右值沒有結(jié)果對象。
該類型不需要是完整類型或擁有可用的析構(gòu)函數(shù),而且類型可以是抽象的。此規(guī)則不適用于其子表達(dá)式:decltype(f(g())) 中,g() 必須有完整類型,但 f() 不必。
注意:
- 如果對象的名字帶有括號,那么它會被當(dāng)做通常的左值表達(dá)式,從而 decltype(x) 和 decltype((x)) 通常是不同的類型。
- 在難以或不可能以標(biāo)準(zhǔn)寫法進(jìn)行聲明的類型時,decltype 很有用,例如 lambda 相關(guān)類型或依賴于模板形參的類型。
2.關(guān)鍵詞decltype
示例:
#include <iostream> #include <type_traits> struct A { double x; }; const A* a; decltype(a->x) y; // y 的類型是 double(其聲明類型) decltype((a->x)) z = y; // z 的類型是 const double&(左值表達(dá)式) template<typename T, typename U> auto add(T t, U u) -> decltype(t + u) // 返回類型依賴于模板形參 { // C++14 開始可以推導(dǎo)返回類型 return t+u; } int main() { int i = 33; decltype(i) j = i * 2; std::cout << "i = " << i << ", " << "j = " << j << '\n'; std::cout << "i 和 j 的類型相同嗎?" << (std::is_same_v<decltype(i), decltype(j)> ? "相同" : "不同") << '\n'; auto f = [](int a, int b) -> int { return a * b; }; decltype(f) g = f; // lambda 的類型是獨(dú)有且無名的 i = f(2, 2); j = g(3, 3); std::cout << "i = " << i << ", " << "j = " << j << '\n'; }
輸出:
i 和 j 的類型相同嗎?相同
i = 33, j = 66
i = 4, j = 9
到此這篇關(guān)于C++ decltype
說明符的文章就介紹到這了,更多相關(guān)decltype 說明符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Cocos2d-x UI開發(fā)之CCControlSlider控件類使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlSlider控件類使用實(shí)例,本文代碼中包含大量注釋講解了CCControlSlider控件類的使用,需要的朋友可以參考下2014-09-09歸并排序的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)代碼
以下是對歸并排序的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-08-08VS Code 中安裝運(yùn)行、編寫C語言程序的詳細(xì)教程
這篇文章主要介紹了VS Code 中安裝運(yùn)行、編寫C語言程序的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03C++實(shí)現(xiàn)LeetCode(14.最長共同前綴)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(14.最長共同前綴),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符
這篇文章主要介紹了C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符,文章基于C語言展開對主題的詳細(xì)介紹,下文內(nèi)容需要的小伙伴可以參考一下2022-04-04解析C語言基于UDP協(xié)議進(jìn)行Socket編程的要點(diǎn)
這篇文章主要介紹了C語言通過UDP協(xié)議進(jìn)行Socket編程的要點(diǎn),文中還提到了相關(guān)ARP與ICMP協(xié)議的作用,需要的朋友可以參考下2016-02-02