| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(C++14) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Defined in header <type_traits> | ||
template<class T> struct is_const; | (since C++11) | |
std::is_const is aUnaryTypeTrait.
IfT is a const-qualified type (that is,const, orconstvolatile), provides the member constantvalue equal totrue. For any other type,value isfalse.
If the program adds specializations forstd::is_const orstd::is_const_v, the behavior is undefined.
Contents |
| T | - | a type to check |
template<class T> constexprbool is_const_v= is_const<T>::value; | (since C++17) | |
value [static] | true ifT is a const-qualified type,false otherwise(public static member constant) |
operator bool | converts the object tobool, returnsvalue (public member function) |
operator() (C++14) | returnsvalue (public member function) |
| Type | Definition |
value_type | bool |
type | std::integral_constant<bool, value> |
IfT is a reference type thenis_const<T>::value is alwaysfalse. The proper way to check a potentially-reference type for constness is to remove the reference:is_const<typename remove_reference<T>::type>.
template<class T>struct is_const:std::false_type{};template<class T>struct is_const<const T>:std::true_type{}; |
#include <type_traits> static_assert(std::is_same_v<constint*,intconst*>,"Remember, constness binds tightly inside pointers.");static_assert(!std::is_const_v<int>);static_assert(std::is_const_v<constint>);static_assert(!std::is_const_v<int*>);static_assert(std::is_const_v<int*const>,"Because the pointer itself can't be changed but the int pointed at can.");static_assert(!std::is_const_v<constint*>,"Because the pointer itself can be changed but not the int pointed at.");static_assert(!std::is_const_v<constint&>);static_assert(std::is_const_v<std::remove_reference_t<constint&>>); struct S{void foo()const{}void bar()const{}}; int main(){// A const member function is const in a different way: static_assert(!std::is_const_v<decltype(&S::foo)>,"Because &S::foo is a pointer."); using S_mem_fun_ptr=void(S::*)()const; S_mem_fun_ptr sfp=&S::foo; sfp=&S::bar;// OK, can be re-pointed static_assert(!std::is_const_v<decltype(sfp)>,"Because sfp is the same pointer type and thus can be re-pointed."); const S_mem_fun_ptr csfp=&S::foo;// csfp = &S::bar; // Error static_assert(std::is_const_v<decltype(csfp)>,"Because csfp cannot be re-pointed.");}
(C++11) | checks if a type is volatile-qualified (class template)[edit] |
(C++17) | obtains a reference toconst to its argument (function template)[edit] |