forwarding(或通用引用)的规范示例如下:
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
当然是推导出来的,但不是它自己的。即使在上面的例子中它不是一个转发引用,这样的构造(函数或成员函数指针参数)可以为它们的参数产生一个转发引用吗?这条规则在这种情况下还适用吗?
1条答案
按热度按时间nxowjjhe1#
不知道
从cppreference(强调我的):
转发引用是一种特殊类型的引用,它保留了函数参数的值类别,使得可以通过
std::forward
转发它。转发引用为:1.声明为右值引用的函数模板的函数参数对同一函数模板的cv-非限定类型模板参数的引用**:
[...示例...]
auto&&
,除非是从花括号括起来的初始化器列表推导出来的:[...更多示例...]
就其价值而言,标准中的相关部分是
[temp.deduct.call]
。我的标准语并不流利,但据我所知,对cppreference(必须是函数模板的参数)的描述是准确的。