std :: bind与可变参数模板成员函数和通用引用

太模糊了

在这里,我有一小段代码,它可以编译并正常工作(至少在我的GCC 7.3.0和Ubuntu 18.04上):

#include <functional>
#include <string>
#include <iostream>

void func(int a, const std::string& b, const std::string& c)
{
  std::cout << a << b << c << std::endl;
}

class Test
{
public:
  template <typename ... ARGS>
  bool func_to_bind(ARGS&& ... args) const {
    func(args...);
    return true;
  }

  template <typename ... ARGS>
  void binding_func(ARGS&& ... args) const 
  {
    auto func_obj = std::bind(&Test::func_to_bind<int&, ARGS&...>, this, 42, args...);
    func_obj();
  }
};


int main()
{
  Test obj;
  obj.binding_func(std::string("one"), std::string("two"));
}

我不明白的部分是这一行:

std::bind(&Test::func_to_bind<int&, ARGS&...>, this, 42, args...);

为什么编译器需要使用引用作为模板类型参数?如果我这样从int删除引用:

std::bind(&Test::func_to_bind<int, ARGS&...>, this, 42, args...);

它不会编译。另外,如果我将func_to_bind签名更改为此:

bool func_to_bind(ARGS& ... args) const

即使缺少参考,它也可以正常编译。谁能解释这到底是怎么回事?我也做了一些搜索,发现了这个问题:如何结合std :: bind(),可变参数模板和完美转发?

但是我不完全理解答案。

songyuanyao

如果您明确指定模板参数int,则的参数类型func_to_bind将变为int&&,即右值引用类型。注意,存储的参数作为左值s通过std::bind以下方式传递给可调用对象

否则,将普通的存储参数arg作为左值参数传递给可调用对象:

无法将左值绑定到rvalue-referece参数,然后调用将失败。

如果int&显式指定了模板参数,则参数类型func_to_bind变为int&,即左值引用类型;左值可以绑定到左值引用,然后它可以正常工作。

而且,如果将参数类型更改func_to_bindARGS&,它将始终是左值引用,出于上述相同的原因,它将可以正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: bind与可变参数模板和自动返回类型

std :: function到可变参数成员函数,然后绑定可变参数模板参数

对带有可变参数模板的std :: ref()和std :: bind()有点迷惑

使用std :: bind和std :: placeholders的可变参数模板工厂

在可变参数模板中使用std :: bind完美转发引用

可变参数模板,std :: function和lambdas作为类成员

从可变参数模板数组引用构造函数初始化双嵌套std :: array

可变参数模板和std :: array意外行为

C ++ 11可变参数模板和std :: endl

可变参数模板,类型扣除和std :: function

std :: function的可变参数模板参数

多维std :: array的可变参数模板

std :: bind与模板成员函数

无法将std :: bind与可变参数模板参数一起使用

可变参数模板函数:没有匹配的调用函数,std :: endl

可变参数模板作为std :: function的参数

std :: function中的可变参数模板参数匹配

使用std :: function作为参数的可变参数模板

如何从可变参数模板参数创建std :: tuple <>?

函数采用可变参数模板包将std :: strings转换为const char *?

可变参数模板方法和std :: function-编译错误

可变参数模板的扩展,继承和std :: unique_ptr

在可变参数模板中使用std :: placeholders

std :: holds_alternative可变参数模板

如何使用可变参数模板使用std :: function

对可变参数模板结构使用std :: visit

constexpr可变参数模板并解压std :: array

可变参数模板展开到std :: tuple

std :: functional中的C ++可变函数模板