Tôi gặp một số khó khăn với việc chuyển tiếp hoàn hảo. Dưới đây là mức độ hiểu biết hiện tại của tôi: keo Mẫu + tham chiếu rvalue + std :: phía trước và một chế độ ma thuật đặc biệt được kích hoạt khi các quy tắc khấu trừ mẫu không có cùng ý nghĩa như thường lệ, nhưng được chế tác để cho phép chuyển tiếp hoàn hảo. Ví dụ:Hoàn hảo chuyển tiếp và std :: tuple (hoặc lớp templated khác)
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
Nhưng điều gì sẽ xảy ra nếu T thực sự là một lớp templated? Ví dụ: làm thế nào tôi có thể hoàn thiện chuyển tiếp tiêu đề :: tuple? Nếu sử dụng T & & làm aboce, tôi sẽ mất tất cả thông tin về các đối tượng chứa trong bộ dữ liệu.
Tuy nhiên đoạn mã sau không thể làm việc:
template <typename... Args>
void outer(std::tuple<Args...>&& t)
{
inner(std::forward<std::tuple<Args...>>(t));
use_args_types_for_something_else<Args...>(); // I need to have Args available
}
int main()
{
std::tuple<int, double, float> t(4, 5.0, 4.0f);
outer(t);
}
cuối chụp gcc nói:
error: cannot bind 'std::tuple<int, double, float> lvalue to
std::tuple<int, double, float>&&
Vì vậy, rõ ràng, chúng tôi vẫn đang trong chung, không mẫu trường hợp vế trái không thể ràng buộc để tham khảo rvalue. "Chế độ forwading Perfect" không được kích hoạt
Vì vậy, tôi đã cố gắng để được lén lút và vượt qua tuple của tôi như là một mẫu template:
template <
typename... Args
template <typename...> class T
>
void outer(T<Args...>&& t)
{
inner(std::forward<T<Args...>>(t));
use_args_type_for_something_else<Args...>();
}
Nhưng tôi vẫn nhận được lỗi tương tự.
Bạn không thể gọi std :: forward mà không chỉ định loại (vì đó là chức năng mẫu và có thể sử dụng khấu trừ)? 'std :: forward (t)' – SoapBox