Мазмунга өтүү

Кемчиликсиз узатуу (perfect forwarding)

Сабактын башталышы

Кемчиликсиз узатуу (perfect forwarding)

Аргументти маанисинин категориясын жоготпой ороочу аркылуу узатуу

Негизги идея: Кемчиликсиз узатуу - жалпы функция шаблонуна каалаган аргументти кабыл алып, аны башка функцияга кабыл алынгандай так берүүгө мүмкүндүк берген ыкма: ал lvalue беле же rvalue беле, жана const беле же жок беле - баары сакталат. Аны иштетүүчү үч бөлүк: узатуу шилтемеси (чыгарылуучу типтеги T&&), компилятор колдонгон шилтемелерди жыйноо эрежелери жана std::forward - чакыруу учурунда баштапкы маанинин категориясын калыбына келтирүүчү шарттуу кастинг.
Аягында сиз мунуларды кыла аласыз:
  • экөө тең T&& деп жазылса да, rvalue-шилтеме менен узатуу шилтемесинин айырмасын түшүндүрүү,
  • шилтемелерди жыйноонун төрт эрежесин кол менен колдонуу,
  • std::forward<T> туура колдонуу (жана бул жерде std::move эмне үчүн ката экенин айтуу),
  • ач конструктор тузагынан качкан вариативдик фабрика функцияларын жана узатуучу конструкторлорду жазуу.

1. Маселе: маанинин категориясын сактаган ороочу

Маанинин категорияларын жылдыруу семантикасы курсунан билесиз: lvalue туруктуу объектти атайт (анын дарегин алса болот), а rvalue - жылдырса боло турган убактылуу объект. Жылдыруу семантикасы убактылуу объект чын эле rvalue катары таанылып, анын ресурстары көчүрүлбөй уурдалганда гана пайда берет.

Ичке ороочуну элестетиңиз - логирлөө катмары, фабрика, контейнердин emplace - ал аргументти кабыл алып, дароо максаттуу sink функциясына берет. Биз ороочу көрүнбөс болушун каалайбыз: чакыруучу убактылуу объект берсе, sink убактылууну көрүшү керек (жана жылдырсын); аталган объект берсе, sink lvalue көрүшү керек (жана көчүрсүн). Жөнөкөй аракеттердин баары ийгиликсиз:

  • void wrap(T v) - маани боюнча кабыл алат, ар бир аргументтин ашыкча көчүрмөсүн же жылдырмасын талап кылат.
  • void wrap(const T& v) - дайыма const-ка lvalue-шилтеме; sink чыныгы убактылуудан да эч качан жылдыра албайт.
  • void wrap(T& v) - rvalue жана const-объекттерди толугу менен четке кагат.

const/const эмес жана lvalue/rvalue ар бир айкалышы үчүн өзүнчө перегрузка жазуу масштабдалбайт: n параметрлүү функцияга 2^n перегрузка керек болмок. Кемчиликсиз узатуу бүт маселени бир шаблон менен чечет.

Максаттын так айтылышы: lvalue болуп келген аргумент lvalue болуп кетет; rvalue болуп келген аргумент rvalue болуп кетет - жана эки учурда тең константтык сакталат.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө