Spec-Zone.ru › C++

std::meta::add_lvalue_reference, std::meta::add_rvalue_reference

Определён в заголовочном файле <meta>
consteval std::meta::info add_lvalue_reference( std::meta::info r );
(1) (начиная с C++26)
consteval std::meta::info add_rvalue_reference( std::meta::info r );
(2) (начиная с C++26)

Возвращает отражение типа lvalue- или rvalue-ссылки для базового типа T, представленного отражением r.

1) Если T — это тип функции без cv- или ref-квалификатора либо объектный тип, возвращает ^^T&. Если T — rvalue-ссылка на тип U, возвращает ^^U&. В противном случае возвращает ^^T.
Эквивалентно return std::meta::dealias(std::add_lvalue_reference_t<T>);.
2) Если T — это тип функции без cv- или ref-квалификатора либо объектный тип, возвращает ^^T&&, иначе возвращает ^^T.
Эквивалентно return std::meta::dealias(std::add_rvalue_reference_t<T>);.

Параметры

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

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

Отражение типа, представленного r, с соответствующим добавлением lvalue- или rvalue-ссылки.

Исключения

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

Примечания

Эти преобразования типов учитывают правила свёртывания ссылок:

  • add_lvalue_reference(^^T&) — это ^^T&,
  • add_lvalue_reference(^^T&&) — это ^^T&,
  • add_rvalue_reference(^^T&) — это ^^T&,
  • add_rvalue_reference(^^T&&) — это ^^T&&.

Главное отличие от непосредственного использования ^^T& состоит в том, что add_lvalue_reference(^^void) — это ^^void, тогда как ^^void& приводит к ошибке компиляции.

Пример

#include <meta>

static_assert
(""
    && std::meta::is_lvalue_reference_type(add_lvalue_reference(^^int))
    && std::meta::is_rvalue_reference_type(add_rvalue_reference(^^int))
    && !std::meta::is_lvalue_reference_type(add_rvalue_reference(^^void))
    && (add_lvalue_reference(^^int) == ^^int&)
    && (add_rvalue_reference(^^int) == ^^int&&)
    && (add_lvalue_reference(^^void) == ^^void)
);

int main() {}

См. также

is_reference_type
(C++26)
проверяет, представляет ли отражение lvalue- или rvalue-ссылку
(функция)
is_lvalue_reference_type
(C++26)
проверяет, представляет ли отражение lvalue-ссылку
(функция)
is_rvalue_reference_type
(C++26)
проверяет, представляет ли отражение rvalue-ссылку
(функция)
is_lvalue_reference_qualifiedis_rvalue_reference_qualified
(C++26)(C++26)
проверяет, является ли отражённая сущность функцией-членом с ref-квалификатором
(функция)
remove_reference
(C++26)
удаляет ссылку из отражённого типа
(функция)
remove_cvref
(C++26)
объединяет meta::remove_cv и meta::remove_reference
(функция)
add_lvalue_referenceadd_rvalue_reference
(C++11)(C++11)
добавляет к заданному типу lvalue- или rvalue-ссылку
(шаблон класса)

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

Spec-Zone.ru

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