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

问题描述 投票:0回答:1

转发(或通用引用)的规范示例如下:

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 参数生成转发引用?该规则是否仍然适用于这种情况?

c++ move-semantics rvalue-reference forwarding-reference
1个回答
1
投票

来自cppreference(强调我的):

转发引用是一种特殊的引用,它保留了函数参数的值类别,使得可以通过

std::forward
转发它。转发参考是:

  1. 函数模板的函数参数声明为对 cv 非限定类型模板参数的右值引用相同的函数模板

[...例子...]

  1. auto&&
    除非从大括号括起来的初始化列表推导出来:

[...更多示例...]

就其价值而言,标准中的相关部分是

[temp.deduct.call]
。我的标准语不流利,但据我了解,cppreference 上的描述(必须是函数模板的参数)是准确的。

© www.soinside.com 2019 - 2024. All rights reserved.