【发布时间】:2016-03-01 00:40:28
【问题描述】:
我知道如何完善转发参数。但是,我从不同的来源(例如 Effective Modern C++ Item 24 - Scott Meyers)读到,只有当您拥有确切的模板名称时,才能完美转发,例如:
template<typename T>
void foo(T&& param) { bar(std::forward<T>(param)); }
我正在寻找的是是否有一种方法可以完善转发模板模板参数,例如:
template<template<int, class TypeT> class Vector, int Size, typename TypeT>
void foo(Vector<Size, TypeT>&& param) { bar(std::forward<Vector<Size, TypeT>>(param)); }
当我编译上述内容时,我收到一条错误消息:“您无法将左值绑定到右值引用”(VC12),这表明编译器无法将 && 识别为“通用引用”,而是作为一个右值引用。这种完美的转发可能对我有用,因为我可以利用推断的 TypeT 和 Size。
问题:是否可以完善转发模板模板参数?如果是这样,我的语法在哪里不正确?
谢谢!
【问题讨论】:
-
没有。你需要带上
T&&,然后再检查std::decay_t<T>。 -
你也可以做 2 个重载,一个用于 r-value,一个用于 l-value。
标签: c++ perfect-forwarding template-templates