带有“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 的函数(在数学意义上),这样说是否正确如果这两个都是真的

那么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 and T deduced always a universal reference?

类型“中”是什么并不重要,重要的是 是什么类型。如果它是对函数模板参数的 cv 非限定右值引用,则它是转发引用。

例如,Foo<T&&> 中有 T&&,但它不是转发引用。 ParamType 也不能成为转发引用,因为它不是函数的模板参数。