c++ 高阶函数参数中的`&&`可以作为转发引用吗?

h6my8fg2  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(146)

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当然是推导出来的,但不是它自己的。即使在上面的例子中它不是一个转发引用,这样的构造(函数或成员函数指针参数)可以为它们的参数产生一个转发引用吗?这条规则在这种情况下还适用吗?

nxowjjhe

nxowjjhe1#

不知道
cppreference(强调我的):
转发引用是一种特殊类型的引用,它保留了函数参数的值类别,使得可以通过std::forward转发它。转发引用为:
1.声明为右值引用的函数模板的函数参数对同一函数模板的cv-非限定类型模板参数的引用**:
[...示例...]

  1. auto&&,除非是从花括号括起来的初始化器列表推导出来的:
    [...更多示例...]
    就其价值而言,标准中的相关部分是[temp.deduct.call]。我的标准语并不流利,但据我所知,对cppreference(必须是函数模板的参数)的描述是准确的。

相关问题