decltype, C++11 ile gelen ve çoğunlukla generic programlamada kullanılan özelliklerden biridir. Türden bağımsız (generic) olarak yazılan kodlarda, bir ifadenin türünün derleme zamanında derleyici tarafından yapılacak bir çıkarımla anlaşılması gereken durumlarda yardımımıza yetişmektedir. Kısaca kendisine verilen ifadenin türünü döndürür. Aynı sizeof() gibi derleme zamanında işini yapar. Aşağıdaki bir değişken için tür bildirimi örneğini görebiliriz:
Basit bir decltype ile değişken bildirim örneği |
decltype & auto
ilk bakışta benzer işler yaptığı izlenimi veren bu iki kavram aslında birbirinden farklı biçimde çalışmaktadır. decltype eğer bir değişkene uygulanmıyorsa çıkarım yapar ve çıkarım yaparken auto'nun tür belirleme kurallarına uymaz. Bu sebeple ikisinin uyguladığı çıkarım kurallarını ayrı ayrı bilmek gerekmektedir.
const int bir değişkeni nasıl algıladıklarına ilişkin örnek aşağıdadır:
const'luk söz konusu olduğunda decltype ile auto farklılığı örneği |
- aval int türünden
- dval const int türünden bildirilecektir.
referans'lık söz konusu olduğunda decltype ile auto farklılığı örneği |
- aval int türünden
- dval const int& türünden bildirilecektir.
container söz konusu olduğunda decltype ile auto farklılığı örneği |
Yukarıdaki farklılığa değineceğimiz ilk nokta vector[0] int türünden olduğu için auto için sadece bunun bir anlamı olacak, decltype için ise vectörün operator[] geri dönüş türü (std::vector<int>::operator[](size_type) const) dikkate alınacaktır ve;
- aval int türünden
- dval const int& türünden bildirilecektir.
r-value referans'lık söz konusu olduğunda decltype ile auto farklılığı örneği |
Yukarıdaki farklılığa değineceğimiz ilk nokta r-value referans olması durumunda auto için bunun bir anlamı olmasa da decltype için r-value referans'lık dikkate alınacaktır ve;
- aval int türünden
- dval int&& türünden bildirilecektir.
Son olarak decltype içerisine değişken dışında ifade yazılması durumunda işlenecek kurallar aşağıdaki gibidir:
decltype(expr)
biçiminde bir kullanımda expr bir değişken değil ise, T ise bu ifadenin türü olsun;Eğer expr bir lvalue (sol taraf değeri) ise decltype(expr) T& olarak ele alınır.
Eğer expr bir xvalue ise decltype(expr) T&& olarak ele alınır.
Eğer ifade bir prvalue (saf sağ taraf değeri) ise decltype(expr) T türü olarak ele alınır.