Spec-Zone.ru › C++

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

Определено в заголовке <meta>
consteval std::meta::info add_const( std::meta::info r );
(1) (начиная с C++26)
consteval std::meta::info add_volatile( std::meta::info r );
(2) (начиная с C++26)
consteval std::meta::info add_cv( std::meta::info r );
(3) (начиная с C++26)

Возвращает отражение типа T, представленного значением r, с добавленным cv-квалификатором. Если r представляет функцию или ссылку либо уже имеет этот квалификатор, r возвращается без изменений.

1) Добавляет квалификатор const.
Эквивалентно return std::meta::dealias(^^std::add_const_t<T>);.
2) Добавляет квалификатор volatile.
Эквивалентно return std::meta::dealias(^^std::add_volatile_t<T>);.
3) Добавляет квалификаторы const и volatile.
Эквивалентно return std::meta::dealias(^^std::add_cv_t<T>);.

Параметры

r - значение отражения

Возвращаемое значение

Отражение типа, представленного значением r, с соответствующим добавлением cv-квалификаторов верхнего уровня.

Исключения

Выбрасывает std::meta::exception, если r не представляет тип или псевдоним типа.

Пример

#include <meta>
#include <print>
#include <source_location>

static_assert
(""
    and (add_const(^^int) == ^^const int)
    and (add_volatile(^^int) == ^^volatile int)
    and (add_cv(^^int) == ^^const volatile int)
    and (add_cv(^^const volatile int) == ^^const volatile int)
    // add_cv only works on types, not on pointers
    and (add_cv(^^int*) != ^^const volatile int*)
    and (add_cv(^^int*) == ^^int* const volatile)
    and (add_cv(^^const volatile int*) == ^^const volatile int* const volatile)
);

inline void fun_name(std::source_location src = std::source_location::current())
{
    return std::println("{}", src.function_name());
}

struct S
{
    void fun() { fun_name(); }
    void fun() const { fun_name(); }
    void fun() volatile { fun_name(); }
    void fun() const volatile { fun_name(); }
};

int main()
{
    S{}.fun();
    typename [:add_const(^^S):]{}.fun();
    typename [:add_volatile(^^S):]{}.fun();
    typename [:add_cv(^^S):]{}.fun();
}

Возможный вывод:

void S::fun()
void S::fun() const
void S::fun() volatile
void S::fun() const volatile

См. также

is_const
(C++26)
проверяет, представляет ли отражение тип const или тип функции с квалификатором const
(функция)
is_volatile
(C++26)
проверяет, представляет ли отражение тип volatile или тип функции с квалификатором volatile
(функция)
remove_cvremove_constremove_volatile
(C++26)(C++26)(C++26)
удаляет квалификаторы const и/или volatile из отражаемого типа
(функция)
as_const
(C++17)
получает ссылку на const для своего аргумента
(шаблон функции)
ranges::as_const_viewviews::as_const
(C++23)
преобразует view в constant_range
(шаблон класса) (объект-адаптер диапазона)
add_cvadd_constadd_volatile
(C++11)(C++11)(C++11)
добавляет квалификаторы const и/или volatile к заданному типу
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/add_cv

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API