Следующий код не компилируется:станд :: свяжи и совершенный экспедиторская
#include <functional>
template<class ...Args>
void invoke(Args&&... args)
{
}
template<class ...Args>
void bind_and_forward(Args&&... args)
{
auto binder = std::bind(&invoke<Args...>, std::forward<Args>(args)...);
binder();
}
int main()
{
int a = 1;
bind_and_forward(a, 2);
}
Если я правильно понимаю, причина заключается в следующем: std::bind
копирует свои аргументы, и при вызове binder
«s operator()
, он передает все связанные аргументы как lvalues - даже те, которые ввели bind
как rvalues . Но invoke
был создан для оригинальных аргументов, и он не может принять то, что binder
пытается его передать.
Есть ли решение проблемы?
Но в таком случае он не будет компилироваться для аргумента, завернутого в 'std :: ref()'. –
@IgorR. Обновлено для этого - 'bind()' делает что-то особенное для 'std :: ref()'. Так что вам придется делать что-то особенное. – Barry