Take parameters properly

На изображении представлен флоучарт с названием "23. Take parameters properly. Effective use of C++" (Правильный приём параметров. Эффективное использование C++). Это сложная блок-схема, описывающая различные подходы к передаче параметров в функциях C++ в зависимости от их типа, использования и характеристик. Схема начинается с вопроса, является ли X "сырым" адресом памяти, и далее ветвится на множество путей, предлагая использовать такие конструкции, как "универсальная ссылка" (universal reference), "std::string_view", "std::optional", "std::unique_ptr", "std::shared_ptr", "ссылка на rvalue" (rvalue reference), "std::span", "std::ranges", передачу по значению (by value) или по константной ссылке (const lvalue reference). На схеме показаны вопросы, такие как "нужно ли X идеально перенаправить" (does x need to be perfectly forwarded), "X является диапазоном" (if x is a range), "X может быть null" (if x can be null), "X является читаемой строкой" (if x is a readonly string), "нужно ли X быть смежным массивом" (does x need to be a contiguous array), "X может быть произвольным диапазоном" (can x be an arbitrary range), "X является вызываемым" (is x an invocable), "нужно ли X быть конкретным контейнером" (does x need to be a specific container), "X перемещен" (if x is moved from), "X скопирован" (if x is copied), "X изменен" (if x is modified), "X дешев в копировании" (if x is cheap to copy). Каждая ветка ведет к рекомендации по способу передачи параметра, например, "take by universal reference", "take std::string_view", "take std::optional of x", "take by unique_ptr, shared_ptr", "take by rvalue reference", "take std::span", "take std::ranges", "take the container", "take iterator pair", "take by value", "take by lvalue reference" или "take by const lvalue reference". Схема является детальным руководством для разработчиков C++ по оптимизации и правильному использованию параметров функций.
23. Take parameters properly. Effective use of C++. Is x a raw memory address? Start here. Use a raw pointer. Is x an invocable? Try in this order. std::invocable<Args...> auto&& x. return_t(*)(Args...). std::move_only_function&&<return_t(Args...)> x. std::function<return_t(Args...)> x. Does x need to be perfectly forwarded? Take by "universal reference" type&& x. If x is a range. If x is a readonly string. If x can be null. Take std::string_view. Take std::optional of x. If needing ownership of x. Take by unique_ptr, shared_ptr. If x is moved from. Does x need to be a contiguous array? Take std::span. Can x be an arbitrary range? Take std::ranges::***. Does x need to be a specific container? Take the container. Take iterator pair. If x is copied. If x is modified. (X is only read from). If x is cheap to copy. Take by value type x. Take by lvalue reference type& x. Take by const lvalue reference const type& x. False. True.
Вы можете искать и отправлять мемы прямо в Telegram!
Просто введите в любом чате "@memexpertbot" и поисковой запрос - бот покажет наиболее подходящие мемы, и вы сможете сразу их отправить.
