Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
add_cvadd_constadd_volatile
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <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
(шаблон класса)[править]
проверяет, является ли тип volatile квалифицированным
(шаблон класса)[править]
удаляет спецификаторы const и/или volatile из данного типа
(шаблон класса)[править]
(C++17)
получает ссылку на константу её аргумента
(шаблон функции)[править]
close