转发(或通用引用)的规范示例如下:
template<typename T>
void f(T&& param);
即
“如果一个变量或参数被声明为具有某种推导类型 T 的 T&& 类型,则该变量或参数是一个通用引用。”
但是考虑一个更人为的例子:
#include <iostream>
class MyClass
{
int _val;
public:
void set_val(int &&newVal)
{
_val = newVal;
std::cout << "New val = " << _val << std::endl;
}
};
template <class T, class V> void evoke(void (T::*method)(V &&))
// The && appears inside the context of a function type ^^^^ argument
{
T obj;
(obj.*method)(2);
}
int main()
{
evoke(&MyClass::set_val);
}
在这种情况下,我发现遵循上述规则令人费解。
V
肯定是推导出来的,但不是单独推导出来的。即使它不是上面示例中的转发引用,这样的构造(函数或成员函数指针参数)是否可以为 their 参数生成转发引用?该规则是否仍然适用于这种情况?
号
来自cppreference(强调我的):
转发引用是一种特殊的引用,它保留了函数参数的值类别,使得可以通过
转发它。转发参考是:std::forward
- 函数模板的函数参数声明为对 cv 非限定类型模板参数的右值引用相同的函数模板:
[...例子...]
除非从大括号括起来的初始化列表推导出来:auto&&
[...更多示例...]
[temp.deduct.call]
。我的标准语不流利,但据我了解,cppreference 上的描述(必须是函数模板的参数)是准确的。