अंतिम अद्यतन:2026-10-12
C++ decltype टाइप deduction¶
लेखक के बारे में:¶
व्यक्तिगत WeChat सार्वजनिक अकाउंट:

1.बुनियादी उपयोग¶
decltype का syntax है:
यहाँ कोष्ठक ज़रूरी हैं, decltype का काम है "expression का टाइप पूछना", इसलिए ऊपर के statement का प्रभाव यह है कि expression एक्सप्रेशन का टाइप लौटाना। ध्यान दें, decltype केवल एक्सप्रेशन का टाइप "पूछता" है, एक्सप्रेशन का "मूल्यांकन" नहीं करता।
1.1 एक्सप्रेशन का टाइप deduce करना¶
1.2 using/typedef के साथ उपयोग, टाइप परिभाषित करने के लिए।¶
using size_t = decltype(sizeof(0));//sizeof(a)的返回值为size_t类型
using ptrdiff_t = decltype((int*)0 - (int*)0);
using nullptr_t = decltype(nullptr);
vector<int >vec;
typedef decltype(vec.begin()) vectype;
for (vectype i = vec.begin; i != vec.end(); i++)
{
//...
}
इस तरह auto की तरह, इससे भी कोड की पठनीयता बढ़ती है।
1.3 anonymous टाइप का पुनः उपयोग¶
C++ में हमें कभी-कभी कुछ anonymous टाइप मिलते हैं, जैसे:
और decltype की मदद से हम इस anonymous स्ट्रक्चर का दोबारा उपयोग कर सकते हैं:
1.4 generic programming में auto के साथ, फ़ंक्शन के रिटर्न टाइप track करने के लिए¶
यही decltype का सबसे बड़ा उपयोग है।
पूरा कोड देखें: decltype.cpp
2.निर्णय नियम¶
decltype(e) के लिए, इसका निर्णय परिणाम निम्नलिखित शर्तों से प्रभावित होता है:
अगर e बिना कोष्ठक वाला id-expression या क्लास मेंबर एक्सेस एक्सप्रेशन है, तो decltype(e) उस entity का टाइप होगा जिसे e नाम देता है। इसके अलावा, अगर e एक overloaded फ़ंक्शन है, तो compile error होगा। वरना, मान लीजिए e का टाइप T है, अगर e एक xvalue है, तो decltype(e) होगा T&& वरना, मान लीजिए e का टाइप T है, अगर e एक lvalue है, तो decltype(e) होगा T&। वरना, मान लीजिए e का टाइप T है, तो decltype(e) होगा T।
id से तात्पर्य कीवर्ड, literal आदि कंपाइलर के उपयोग वाले चिह्नों के अलावा प्रोग्रामर द्वारा खुद परिभाषित नामों से है, और एकल id से जुड़ा एक्सप्रेशन id-expression कहलाता है। उदाहरण के लिए:
तो arr एक id-expression है, जबकि arr[3]+0 नहीं।उदाहरण नीचे दिए गए हैं:
int i = 4;
int arr[5] = { 0 };
int *ptr = arr;
struct S{ double d; }s ;
void Overloaded(int);
void Overloaded(char);//重载的函数
int && RvalRef();
const bool Func(int);
//规则一:推导为其类型
decltype (arr) var1; //int[] 标记符表达式
decltype (ptr) var2;//int * 标记符表达式
decltype(s.d) var3;//doubel 成员访问表达式
//decltype(Overloaded) var4;//重载函数。编译错误。
//规则二:将亡值。推导为类型的右值引用。
decltype (RvalRef()) var5 = 1;
//规则三:左值,推导为类型的引用。
decltype ((i))var6 = i; //int&
decltype (true ? i : i) var7 = i; //int& 条件表达式返回左值。
decltype (++i) var8 = i; //int& ++i返回i的左值。
decltype(arr[5]) var9 = i;//int&. []操作返回左值
decltype(*ptr)var10 = i;//int& *操作返回左值
decltype("hello")var11 = "hello"; //const char(&)[9] 字符串字面常量为左值,且为const左值。
//规则四:以上都不是,则推导为本类型
decltype(1) var12;//const int
decltype(Func(1)) var13=true;//const bool
decltype(i++) var14 = i;//int i++返回右值
सीखने के लिए रेफ़रेंस: https://www.cnblogs.com/QG-whz/p/4952980.html
संबंधित विषय¶
- C++ प्योर वर्चुअल फ़ंक्शन और एब्स्ट्रैक्ट क्लास | C++那些事
- C++ assert | C++那些事
- C++ bit-field | C++那些事
- C भाषा से C++ पॉलीमॉर्फ़िज़्म | C++那些事
- C++ const constant और qualifier | C++那些事
- C++ const परिवार | C++那些事
- C++ dereference ऑपरेटर * | C++那些事
- C++ इनिशियलाइज़ेशन और असाइनमेंट | C++那些事
- C++ multiple return values लिखने के तरीके | C++那些事
- C++ mutable कीवर्ड | C++那些事