IT

언제 std :: forward를 사용하여 인수를 전달합니까?

lottoking 2020. 6. 14. 10:08
반응형

언제 std :: forward를 사용하여 인수를 전달합니까?


C ++ 0x는 다음을 사용하는 예를 보여줍니다 std::forward.

template<class T>
void foo(T&& arg) 
{
  bar(std::forward<T>(arg));
}

언제 사용하는 것이 유리 std::forward합니까?

또한 &&매개 변수 선언 에 사용해야 합니다. 모든 경우에 유효합니까? 함수가 선언 된 경우 임시 함수를 함수에 전달해야한다고 생각 &&했으므로 매개 변수로 foo를 호출 할 수 있습니까?

마지막으로 다음과 같은 함수 호출이있는 경우 :

template<int val, typename... Params>
void doSomething(Params... args) {
  doSomethingElse<val, Params...>(args...);
}

대신 이것을 사용해야합니까?

template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}

또한 함수에서 매개 변수를 두 번 사용하는 경우 (즉, 동시에 두 개의 함수로 전달) 사용하는 것이 std::forward좋습니까? std::forward같은 것을 일시적으로 두 번 변환 하지 않고 메모리를 이동시키고 두 번째 사용에는 유효하지 않습니까? 다음 코드가 정상입니까?

template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
  doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}

나는 약간 혼란스럽고 std::forward기꺼이 정리를 사용합니다.


첫 번째 예제처럼 사용하십시오.

template <typename T> void f(T && x)
{
  g(std::forward<T>(x));
}

template <typename ...Args> void f(Args && ...args)
{
  g(std::forward<Args>(args)...);
}

그 때문에의의 규칙을 무너 참조 : 만약 T = U&, 다음 T&& = U&,하지만 만약 T = U&&다음 T&& = U&&, 당신은 항상 함수 본문 내부의 올바른 유형으로 끝낼 수 있도록. 마지막으로 forwardlvalue-turned x(지금 이름이 있기 때문에)를 rvalue 참조로 되돌려 야합니다.

즉 일반적으로 의미하지 않기 때문에 당신은, 그러나 한 번 이상 전달하지 뭔가를해야한다 : 당신은 가능성이 있다는 것을 전달 수단 움직이는 모든 방법을 최종 호출을 통해 인수를하고 이동 된 후에는 당신이 그것을 사용하지 수 있도록이 사라 졌어요 다시 (당신이 아마 의도했던 방식으로).

참고 URL : https://stackoverflow.com/questions/7257144/when-to-use-stdforward-to-forward-arguments

반응형