C ++ 0x cho thấy một ví dụ về việc sử dụng std::forward
:
template<class T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
Khi nào thì thuận lợi để sử dụng std::forward
, luôn luôn?
Ngoài ra, nó yêu cầu sử dụng &&
trong khai báo tham số, nó có hợp lệ trong mọi trường hợp không? Tôi nghĩ rằng bạn phải chuyển tạm thời cho một hàm nếu hàm được khai báo &&
trong đó, vì vậy foo có thể được gọi với bất kỳ tham số nào không?
Cuối cùng, nếu tôi có một chức năng gọi như thế này:
template<int val, typename... Params>
void doSomething(Params... args) {
doSomethingElse<val, Params...>(args...);
}
Tôi có nên sử dụng cái này thay thế:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
Ngoài ra, nếu sử dụng các tham số hai lần trong hàm, tức là chuyển tiếp đến hai hàm cùng một lúc, có nên sử dụng std::forward
không? Không std::forward
chuyển đổi điều tương tự thành tạm thời hai lần, di chuyển bộ nhớ và làm cho nó không hợp lệ cho lần sử dụng thứ hai? Các mã sau sẽ ổn chứ:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Tôi có một chút bối rối std::forward
, và tôi sẵn sàng sử dụng một số thanh toán bù trừ.
Args...&& args
?