std::add_cv, std::add_const, std::add_volatile - cppreference.com

##### cppreference.com

##### Search

Create account

##### Namespaces

- Page
- Discussion

##### Variants

##### Views

- View
- Edit
- History

##### Actions

# std::add_cv, std::add_const, std::add_volatile

From cppreference.com
< cpp‎ | types

Defined in header `<type_traits>` |  |
template< class T > struct add_cv; | (1) | (since C++11)
template< class T > struct add_const; | (2) | (since C++11)
template< class T > struct add_volatile; | (3) | (since C++11)

Provides the member typedef `type` which is the same as `T`, except it has a cv-qualifier added (unless `T` is a function, a reference, or already has this cv-qualifier)

1) adds both const and volatile

2) adds const

3) adds volatile

### [edit] Member types

Name | Definition
`type` | the type `T` with the cv-qualifier

### [edit] Helper types

template< class T > using add_cv_t = typename add_cv<T>::type; |  | (since C++14)
template< class T > using add_const_t = typename add_const<T>::type; |  | (since C++14)
template< class T > using add_volatile_t = typename add_volatile<T>::type; |  | (since C++14)

### [edit] Possible implementation

    template< class T >
    struct add_cv {
        typedef typename std::add_volatile<typename std::add_const<T>::type>::type type;
    };

    template< class T> struct add_const { typedef const T type; };

    template< class T> struct add_volatile { typedef volatile T type; };

### [edit] Example

Run this code

    #include <iostream>
    #include <type_traits>

    struct foo
    {
        void m() { std::cout << "Non-cv\n"; }
        void m() const { std::cout << "Const\n"; }
    };

    template <class T>
    void call_m()
    {
        T().m();
    }

    int main()
    {
        call_m<foo>();
        call_m<std::add_const<foo>::type>();
    }

Output:

    Non-cv
    Const

### [edit] See also

is_const (C++11) | checks if a type is const-qualified (class template) [edit]
is_volatile (C++11) | checks if a type is volatile-qualified (class template) [edit]
remove_cvremove_constremove_volatile (C++11)(C++11)(C++11) | removes const or/and volatile specifiers from the given type (class template) [edit]

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/types/add_cv&oldid=63000"