【发布时间】:2020-03-07 10:07:00
【问题描述】:
我正在尝试编写一个只接受std::vector 作为参数的模板函数。但是我想出的仅适用于普通或左值参数,但不适用于转发引用参数。
以下代码无法编译。
template <typename T, typename = typename std::enable_if< std::is_same<T, std::vector< typename T::value_type, typename T::allocator_type > >::value>::type >
int f(T && a) {
return a.size();
}
int main() {
std::vector<int> a;
f(a);
}
但是,如果我将 f 的参数类型替换为左值引用或按值类型传递,如下所示:
template <typename T, typename = typename std::enable_if< std::is_same<T, std::vector< typename T::value_type, typename T::allocator_type > >::value>::type >
int f(T a) {
return a.size();
}
比它编译。
请注意,我需要有 f 参数作为转发引用。
我错过了什么?
【问题讨论】:
-
在转发引用版本
T被推断为vector<int>&,所以你不能只使用T,你需要通过std::remove_reference_t<T>丢弃该类型的引用。 Demo -
是的,你是对的! @rafix07
标签: c++ templates forwarding-reference