decltype specifier (decltype fonksiyonu) - 1

07:25 ,
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(...) ve decltype((...)) farklı anlamlara gelir. Eğer int param = 3; bildiriminin ardından decltype(param) ifadesi int sonucunu verir. decltype((param ))  ifadesi ise int& sonucunu verir. Parantezlere ilişkin bu kurala dikkat edilmesi gerekir.

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
Yukarıdaki farklılığa değineceğimiz ilk nokta const (top level const) olması durumunda auto için bunun bir anlamı olmasa da decltype için const'luk dikkate alınacaktır ve;
  • aval int türünden
  • dval const int türünden bildirilecektir.
(const) int& bir değişkeni nasıl algıladıklarına ilişkin örnek aşağıdadır:
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 referans olması durumunda auto için bunun bir anlamı olmasa da decltype için referans'lık dikkate alınacaktır ve;
  • aval int türünden
  • dval const int& türünden bildirilecektir.
bir container elemanını nasıl algıladıklarına ilişkin örnek aşağıdadır:
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.
bir r-value değişkeni nasıl algıladıklarına ilişkin örnek aşağıdadır:
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.