Spec-Zone.ru › C++

std::basic_common_reference<std::reference_wrapper>

Определено в заголовке <functional>
template< class R, class T,
          template<class> RQual, template<class> TQual >
    requires (/*ref-wrap-common-reference-exists-with*/<R, T, RQual<R>, TQual<T>> &&
              !/*ref-wrap-common-reference-exists-with*/<T, R, TQual<T>, RQual<R>>)
struct basic_common_reference<R, T, RQual, TQual>;
(1) (с C++23)
template< class T, class R,
          template<class> TQual, template<class> RQual >
    requires (/*ref-wrap-common-reference-exists-with*/<R, T, RQual<R>, TQual<T>> &&
              !/*ref-wrap-common-reference-exists-with*/<T, R, TQual<T>, RQual<R>>)
struct basic_common_reference<T, R, TQual, RQual>;
(2) (с C++23)
Вспомогательные концепции
template< class R, class T, class RQ, class TQ >
concept /*ref-wrap-common-reference-exists-with*/ =
    /*is-ref-wrapper*/<R> &&
    requires { typename std::common_reference_t<typename R::type&, TQ>; } &&
    std::convertible<RQ, std::common_reference_t<typename R::type&, TQ>>;
(3) (только для демонстрации*)

Тип общей ссылки для reference_wrapper (обозначается как R) и типа T, соответственно применённых с квалификаторами cv и ссылок (обозначаются как RQ и TQ соответственно), эквивалентен типу общей ссылки для базового типа R, применённого с ссылкой на lvalue и TQ.

Тип общей ссылки определяется только в том случае, если R является единственной reference_wrapper, базовый тип R применённый с ссылкой на lvalue и TQ имеют тип общей ссылки, в которую RQ должна быть преобразуема.

Только для демонстрации константа /*is-ref-wrapper*/<R> равна true тогда и только тогда, когда R является специализацией std::reference_wrapper.

Типы-члены

Тип-член Определение
type std::common_reference_t<typename R::type&, TQual<T>> (1,2)

Примечания

Макрокоманда проверки наличия функции Значение Стандарт Функция
__cpp_lib_common_reference_wrapper 202302L (C++23) Преобразовать std::common_reference_t std::reference_wrapper в тип ссылки

Пример

#include <concepts>
#include <functional>
 
static_assert(std::same_as<std::common_reference_t<int&,
                                                   std::reference_wrapper<int>>,
                                                   int&>);
static_assert(std::same_as<std::common_reference_t<std::reference_wrapper<int>&,
                                                   int&>,
                                                   int&>);
static_assert(std::same_as<std::common_reference_t<int&,
                                                   const std::reference_wrapper<int>&>,
                                                   int&>);
int main() {}

См. также

common_referencebasic_common_reference
(C++20)
определяет тип общей ссылки для группы типов
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/basic_common_reference

Spec-Zone.ru

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