Здесь у меня есть небольшой кусочек кода, и он прекрасно компилируется и работает (по крайней мере, с моим 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 (), шаблоны variadic и идеальную пересылку?
Но я не совсем понимаю ответ.