带有“T&&”和“T”推导的参数类型是否始终是通用引用?
Is a parameter type with `T&&` in it and `T` deduced always a universal reference?
参照
template<typename T>
void fun(ParamType param); // ParamType is some form of T, e.g. T, T&, T const, ...
fun(expr); // expr is an expression
我知道 ParamType
中的 &&
“某处”不足以使 ParamType
成为通用引用,例如 ParamType = std::vector<T>&&
是右值引用。 &&
需要在模板参数 T
旁边,因为它 (T&&
) 到 可能 是一个通用参考。
但我也知道 T&&
ParamType
中的“某处”仍然不够,例如 ParamType = std::remove_reference_t<T&&>
不是通用参考。
因此,我几乎是在问 there/what ParamType
的“格式”是否有要求才能作为转发参考?。
但是,
为简单起见,假设 T
是唯一的模板参数,因此,ParamType
只是 T
的函数(在数学意义上),这样说是否正确如果这两个都是真的
T
以ParamType
形式出现T&&
fun
推导出T
和PramType
(即T
不需要通过fun<T>
传递)
那么ParamType
是通用引用吗?
换句话说,如果 ParamType
中有一个 T&&
并推导出 T
,它是否总是一个通用引用?
不,不是。
我没有想到明显的情况!
template<typename T>
void fun(const T&&) {}
这里T&&
是ParamType
的一部分(也就是const T&&
),T
是推导的,但是ParamType
是右值引用
(可能我没有想到这一点,因为我养成了在类型后面加上 const
的习惯,如 T const&&
。)
what are the requirements on the "form" of ParamType for it to be a forwarding reference?.
来自标准(最新草案):
[temp.deduct.call] A forwarding reference is an rvalue reference to a cv-unqualified template parameter that does not represent a template parameter of a class template
Is a parameter type with
T&&
in it andT
deduced always a universal reference?
类型“中”是什么并不重要,重要的是 是什么类型。如果它是对函数模板参数的 cv 非限定右值引用,则它是转发引用。
例如,Foo<T&&>
中有 T&&
,但它不是转发引用。 ParamType
也不能成为转发引用,因为它不是函数的模板参数。