std :: function указатель на функцию-член, принимающую аргумент rvalue MSVC2010 SP1

Я хотел бы создать std :: function, связанную с функцией-членом, принимающей аргумент rvalue. Вот моя попытка, которая не компилируется («xxfunction (154): ошибка C2664: … Вы не можете связать lvalue со ссылкой на rvalue» среди других).

    class C
{
public:
void F(std::string &&s)
{
//do something with s
}
C(){}
};
C c;
std::function<void(std::string&&)> pF = std::bind(&C::F,&c,std::placeholders::_1);
//somewhere far far away
pF(std::string("test"));

Я немного читал, и я думаю, что это связано с std :: function no, с использованием совершенной пересылки, но я не могу понять, как заставить его работать.

Редактировать:

std::function<void(std::string&)> pF = [&c](std::string&in){c.F(std::move(in));};

Это полунезависимая работа, но она не идеальна, потому что вызов pF теперь будет работать с lvalue и все равно его перемещать.

std::string s("test");
pF(s);
auto other = s; //oops

2

Решение

Кажется твой std::bind реализация не поддерживает идеальную пересылку через заполнители, но так как у вас есть C ++ 11 и std::bind В любом случае это уродливо, используйте лямбды:

std::function<void(std::string&&)> pF
= [&c](std::string&& str)
{
c.F(std::move(str));
};

Редактировать:

ЗаметкаХотя этот ответ принят, этот ответ не является решением проблемы, потому что это не std::bind но MSVC10 std::function реализация, которая имеет недостатки. Однако это предложение привело к обходному пути и поэтому было принято PorkyBrain.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]