大家可能都知道,我们使用右值引用结合引用折叠规则来构建完美的转发函数,像这样
template<typename T>
void f(T&& arg) {
otherfunc(std::forward<T>(arg));
}
f(4);
参考折叠规则就像
+------+-----+--------+
| T | Use | Result |
|------|--------------|
| X& | T& | X& |
| X& | T&& | X& |
| X&& | T& | X& |
| X&& | T&& | X&& |
+------+-----+--------+
因此,在我的示例f
中,T
isint&&
和T&&
isint&& &&
折叠为int&&
.
T
我的问题是,如果已经推导出来,为什么我们需要这些规则int&&
?为什么会
template<typename T>
void f(T arg);
f(4);
变成void f(int)
而不是void f(int&&)
if T
is int&&
? 如果T
is really int
and T&&
is 是什么使它成为int&&
and 因此void f(int&&)
,那么为什么我们需要参考折叠规则,因为它们似乎从未应用过?根据我有限的知识,我只能说出这两个选项,所以显然有一条我不知道的规则。
查看标准中关于此的引用也会有所帮助。