C의 완벽한 전달은 원래 값 범주 (lvalue 또는 rvalue) 및 유형을 유지하면서 한 기능에서 다른 기능으로 인수를 전달할 수있는 기술입니다. 이것은 원래 통화의 효율성과 의미를 보존하는 방식으로 인수를 다른 기능으로 전달 해야하는 템플릿 기능을 작성할 때 특히 유용합니다.
참조 붕괴와 std::forward
결합하여 완벽한 전달 작업. 작동 방식은 다음과 같습니다.
T& &&
)에 대한 rvalue 참조는 lvalue 참조 ( T&
)로 무너지고 다른 조합 ( T&& &&
또는 T& &
)은 가장 안쪽 참조의 유형으로 무너집니다.auto&&
또는 템플릿 매개 변수)에서 T&&
사용하여 달성됩니다.std::forward
유틸리티는 기능 내에서 인수를 다른 함수로 전달하여 값 범주를 보존하는 데 사용됩니다. std::forward<t>(arg)</t>
사용하면 T
lvalue 참조 인 경우 T
에 arg
주조하거나 T
rvalue 참조 인 경우 T&&
로 표시됩니다.완벽한 전달을 보여주는 간단한 예는 다음과 같습니다.
<code class="cpp">template<typename t> void wrapper(T&amp;& arg) { // Forward 'arg' to another function, preserving its value category anotherFunction(std::forward<t>(arg)); } void anotherFunction(int& arg) { /* lvalue overload */ } void anotherFunction(int&& arg) { /* rvalue overload */ } int main() { int x = 5; wrapper(x); // Calls anotherFunction(int&) because x is an lvalue wrapper(5); // Calls anotherFunction(int&&) because 5 is an rvalue return 0; }</t></typename></code>
이 예에서 wrapper
완벽한 전달을 사용하여 arg
anotherFunction
으로 전달하여 원래 인수의 값 범주에 따라 anotherFunction
을 과부하시킬 수 있습니다.
C에서 완벽한 전달을 사용하는 이점은 다음과 같습니다.
완벽한 전달은 여러 가지 방법으로 C에서 템플릿 기능의 효율을 크게 향상시킬 수 있습니다.
다음은 완벽한 전달이 효율성을 향상시킬 수있는 방법을 보여주는 예입니다.
<code class="cpp">template<typename t> void efficientWrapper(T&amp;& arg) { std::vector<int> v(std::forward<t>(arg)); // Efficiently constructs v from arg } int main() { std::vector<int> source = {1, 2, 3}; efficientWrapper(std::move(source)); // Moves the contents of source into v return 0; }</int></t></int></typename></code>
이 예에서 efficientWrapper
전달은 완벽한 전달을 사용하여 arg
에서 v
효율적으로 구성합니다. arg
가 rvalue ( main
함수에서와 같이) 인 경우 불필요한 복사를 피하기 위해 움직임을 사용합니다.
C에서 완벽한 전달을 구현할 때는 알고 있고 피해야 할 몇 가지 일반적인 함정이 있습니다.
std::forward
std::forward
잘못된 사용은 원래 전달 참조를 취한 함수 내에서만 사용해야합니다. 이 맥락 밖에서 그것을 사용하면 잘못된 행동으로 이어질 수 있습니다. 예를 들어, 회원 변수에 전달 참조를 저장 한 다음 나중에 전달하면 문제가 발생할 수 있습니다.T&amp; &&
는 항상 T&
T&& &&
T&&
된다는 점을 명심하십시오.다음은 일반적인 함정과 피하는 방법의 예입니다.
<code class="cpp">// Incorrect use of std::forward class IncorrectUsage { template<typename t> void incorrectForward(T&amp;& arg) { store = std::forward<t>(arg); // Incorrect: don't use std::forward here } std::string store; }; // Correct use of std::forward class CorrectUsage { template<typename t> void correctForward(T&amp;& arg) { store = std::forward<t>(arg); // Correct: use std::forward immediately } std::string store; };</t></typename></t></typename></code>
IncorrectUsage
클래스에서 std::forward
저장된 멤버 변수에 사용되며, 이는 잘못된 동작으로 이어질 수 있습니다. CorrectUsage
클래스에서 std::forward
인수의 올바른 값 범주를 보존하여 함수 내에서 즉시 사용됩니다.
이러한 함정을 알고 모범 사례를 따르면 완벽한 전달을 효과적으로 사용하여보다 효율적이고 올바른 C 코드를 작성할 수 있습니다.
위 내용은 C의 완벽한 전달은 무엇이며 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!