Как std::forward облегчает идеальную пересылку ссылок Lvalue и Rvalue
В C std::forward играет решающую роль в достижении идеальная пересылка, которая гарантирует, что аргументы передаются функциям с сохранением их исходной категории значений. Такое поведение может особенно сбивать с толку при работе со ссылками lvalue и rvalue.
Различие Lvalue и Rvalue
"Если у него есть имя, то это lvalue". Хотя это высказывание в целом справедливо, оно не полностью объясняет поведение std::forward при работе сthing&& x иthing& x.
Ссылки на Lvalue (thing& x)
Когда аргумент передается по ссылке lvalue, он остается ссылкой lvalue внутри функции. Ссылки Lvalue всегда привязаны к определенному именованному месту в памяти.
Ссылки Rvalue (thing&& x)
Напротив, когда аргумент передается по ссылке rvalue, он может быть либо ссылкой rvalue, либо преобразованной ссылкой lvalue. Ссылка rvalue привязана к временному объекту или значению, которое перемещается.
Как работает std::forward
std::forward определяется специальным таблица преобразования. Его основная цель — преобразовать ссылку любого типа в ссылку rvalue. Это преобразование не меняет категорию значения исходного аргумента.
Пример: идеальная пересылка с использованием std::forward
Рассмотрим шаблонную функцию perfectSet, которая принимает аргумент T&& :
templatevoid perfectSet(T&& t) { set(std::forward (t)); }
Теперь, когда PerfectSet вызывается со значением lvalue, тип T в созданной функции выводится как T&. Преобразование std::forward гарантирует, что аргумент будет передан в качестве ссылки lvalue.
std::vectorv; perfectSet(v); // lvalue reference passed to set
Однако, если perfectSet вызывается с rvalue, T выводится как T&&, а std::forward преобразует аргумент в ссылку rvalue, включая семантику перемещения в set:
perfectSet(makeAndFillVector()); // rvalue reference passed to set
Заключение
std::forward — это мощный инструмент, который обеспечивает идеальную пересылку, сохраняя категорию значений аргументов, передаваемых функциям. Это обеспечивает эффективную и типобезопасную передачу значений, обеспечивая оптимальную производительность и корректность кода.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3