std::add_cv, std::add_const, std::add_volatile
Материал из cppreference.com
Определено в заголовочном файле <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-квалификаторами |
[править]Вспомогательные типы
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 {typedefconstvolatile T type;}; template<class T>struct add_const {typedefconst T type;}; template<class T>struct add_volatile {typedefvolatile 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()constvolatile{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) | получает ссылку на константу её аргумента (шаблон функции) |