23 Kasım 2018 Cuma

std::is_const

Giriş
Açıklaması şöyle.
If T is a const-qualified type (that is, const, or const volatile), provides the member constant value equal true. For any other type, value is false.
İlginç bir şekilde reference tipler const kabul edilmiyorlar.

Örnek
Şöyle yaparız.
std::cout << std::is_const<int>::value << '\n'; // false
std::cout << std::is_const<const int>::value  << '\n'; // true
std::cout << std::is_const<const int*>::value  << '\n'; // false
std::cout << std::is_const<int* const>::value  << '\n'; // true
std::cout << std::is_const<const int&>::value  << '\n'; // false
Örnek
vector'ün döndürdüğü iterator int& veya const int& döner. Referans'ı kaldırmak için std::remove_reference() kullanılır. Şöyle yaparız
std::vector<int> vec{0};

for(auto it=vec.begin(); it!=vec.end(); ++it) {
  std::cout << std::is_const<std::remove_reference<decltype(*it)>::type>::value;
}

for(auto it=vec.cbegin(); it!=vec.cend(); ++it) {
  std::cout << std::is_const<std::remove_reference<decltype(*it)>::type>::value;
}
Örnek
Aşağıdaki örnekte l-value değişken const reference olarak perfert forwarding'e uğruyor ve const reference const kabul edilmediği için sonuç 0 çıkıyor.
#include <iostream> 
#include <type_traits> 
using namespace std; 
template<class T> 
void f(T&& t) 
{ 
     cout<<is_const<T>()<<endl; 
     //++t; 
} 
int main() { 
     const int i=0; 
     f(i); 
     return 0; 
} 

Hiç yorum yok:

Yorum Gönder