std::add_cv, std::add_const, std::add_volatile
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <type_traits>
|
||
template< class T > struct add_cv; |
(1) | (начиная с C++11) |
template< class T > struct add_const; |
(2) | (начиная с C++11) |
template< class T > struct add_volatile; |
(3) | (начиная с C++11) |
Предоставляет typedef элемент type, который такой же, как и T, за исключением того, что к нему добавлен cv-квалификатор (если только T не является функцией, ссылкой или уже имеет этот cv-классификатор)
1) добавляет и const, и volatile
2) добавляет const
3) добавляет volatile
Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.
Типы-элементы
| Имя | Определение |
type
|
тип T с cv-квалификаторами
|
Вспомогательные типы
<tbody> </tbody> template< class T > using add_cv_t = typename add_cv<T>::type; |
(начиная с C++14) | |
template< class T > using add_const_t = typename add_const<T>::type; |
(начиная с C++14) | |
template< class T > using add_volatile_t = typename add_volatile<T>::type; |
(начиная с C++14) | |
Возможная реализация
template<class T> struct add_cv { typedef const volatile T type; };
template<class T> struct add_const { typedef const T type; };
template<class T> struct add_volatile { typedef volatile T type; };
|
Примечание
Эти свойства преобразования можно использовать для установления невыведенных контекстов при выводе аргументов шаблона:
template<class T>
void f(const T&, const T&);
template<class T>
void g(const T&, std::add_const_t<T>&);
f(4.2, 0); // ошибка, выведены конфликтующие типы для 'T'
g(4.2, 0); // ОК, вызывает g<double>
Пример
Запустить этот код
#include <iostream>
#include <type_traits>
struct foo
{
void m() { std::cout << "Не-cv\n"; }
void m() const { std::cout << "Const\n"; }
void m() volatile { std::cout << "Volatile\n"; }
void m() const volatile { std::cout << "Const-volatile\n"; }
};
int main()
{
foo{}.m();
std::add_const<foo>::type{}.m();
std::add_volatile<foo>::type{}.m();
std::add_cv<foo>::type{}.m();
}
Вывод:
Не-cv
Const
Volatile
Const-volatile
Смотрите также
(C++11) |
проверяет, является ли тип квалифицированным как const (шаблон класса) |
(C++11) |
проверяет, является ли тип volatile квалифицированным (шаблон класса) |
(C++11)(C++11)(C++11) |
удаляет спецификаторы const и/или volatile из данного типа (шаблон класса) |
(C++17) |
получает ссылку на константу её аргумента (шаблон функции) |