언제 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&&
, 당신은 항상 함수 본문 내부의 올바른 유형으로 끝낼 수 있도록. 마지막으로 forward
lvalue-turned x
(지금 이름이 있기 때문에)를 rvalue 참조로 되돌려 야합니다.
즉 일반적으로 의미하지 않기 때문에 당신은, 그러나 한 번 이상 전달하지 뭔가를해야한다 : 당신은 가능성이 있다는 것을 전달 수단 움직이는 모든 방법을 최종 호출을 통해 인수를하고 이동 된 후에는 당신이 그것을 사용하지 수 있도록이 사라 졌어요 다시 (당신이 아마 의도했던 방식으로).
참고 URL : https://stackoverflow.com/questions/7257144/when-to-use-stdforward-to-forward-arguments
'IT' 카테고리의 다른 글
중첩을 줄이기 위해“if”문을 반전 (0) | 2020.06.14 |
---|---|
Firemonkey에서 "No Activate"양식을 만드는 방법 (0) | 2020.06.14 |
Git 소스 제어 하에서 IntelliJ IDEA 프로젝트 파일을 처리하는 방법은 끊임없이 변경됩니까? (0) | 2020.06.14 |
누가이 프로그래밍 말을 썼습니까? (0) | 2020.06.14 |
코딩 표준 세트와 비교하여 C / C ++ 소스 코드를 확인하는 무료 도구? (0) | 2020.06.14 |