Использование std::forward: точная пересылка аргументов
При передаче аргументов функциям в C очень важно учитывать используемые ссылочные модификаторы определить параметры функции. Использование std::forward обеспечивает гибкость при обработке ссылок на аргументы.
Преимущества std::forward
В C 0x std::forward используется явно переместить аргументы в функцию. Это выгодно, когда функция принимает универсальные ссылки (T&&) и вы хотите сохранить исходный тип ссылки, будь то ссылка lvalue или ссылка rvalue.
Использование && в объявлении параметра
Использование && в объявлениях параметров указывает, что разрешены только ссылки rvalue. Однако это не означает, что функции && параметры можно вызывать только с помощью временных объектов. В приведенном примере foo можно вызывать с аргументами любого типа, включая lvalue.
Пересылка аргументов в функциях шаблона
В контексте функций шаблона это важно использовать std::forward при передаче аргументов другой функции в шаблоне. Это гарантирует, что во вложенную функцию будет передан правильный тип аргумента, независимо от того, является ли он lvalue или rvalue. Например:
template
void doSomething(Params... args) {
doSomethingElse(args...);
}
Это не будет работать должным образом, поскольку в doSomethingElse нет && параметры. Вместо этого следует использовать следующий код:
template
void doSomething(Params&&... args) {
doSomethingElse(std::forward(args)...);
}
Множественная пересылка аргументов
Как правило, не рекомендуется пересылать аргумент несколько раз в одной и той же функции. std::forward преобразует lvalue в ссылку rvalue, и повторная пересылка приведет к другому преобразованию, что может привести к аннулированию памяти. Например, не следует использовать следующий код:
template
void doSomething(Params&&... args) {
doSomethingElse(std::forward(args)...);
doSomethingWeird(std::forward(args)...);
}
В заключение, std::forward играет решающую роль в обеспечении точной пересылки аргументов в C . Это помогает поддерживать заданный тип ссылки и обеспечивает плавное взаимодействие между функциями с различными квалификаторами ссылки, особенно в контекстах шаблонов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3