У меня есть неисследованный объект-функтор, который я пытаюсь сохранить как std::function
внутри другого объекта. Этот объект действительно тяжеловесный, поэтому он помечается как незамкнутый, но имеет конструктор перемещения. Однако попытка построить std:: function или назначить его из временного конструктора не удалась.
Вот минимальный пример, чтобы спровоцировать ошибку.
// pretend this is a really heavyweight functor that can't be copied.
struct ExampleTest
{
int x;
int operator()(void) const {return x*2;}
ExampleTest( ) :x(0){}
ExampleTest( int a ) :x(a){}
// allow move
ExampleTest( ExampleTest &&other ) :x(other.x) {};
private: // disallow copy, assignment
ExampleTest( const ExampleTest &other );
void operator=( const ExampleTest &other );
};
// this sometimes stores really big functors and other times stores tiny lambdas.
struct ExampleContainer
{
ExampleContainer( int );
std::function<int(void)> funct;
};
/******** ERROR:
Compiler error: 'ExampleTest::ExampleTest' : cannot access private member
declared in class 'ExampleTest'
******************/
ExampleContainer::ExampleContainer( int x )
: funct( ExampleTest( x ) )
{}
/******** ERROR:
Compiler error: 'ExampleTest::ExampleTest' : cannot access private member
declared in class 'ExampleTest'
******************/
int SetExample( ExampleContainer *container )
{
container->funct = ExampleTest();
return container->funct();
}
В еще более простой конструкции, где я просто создаю локальную функцию, я также получаю ошибку:
int ContrivedExample( )
{
// extra parens to sidestep most vexing parse
std::function<int()> zug( (ExampleTest()) );
/*** ERROR: 'ExampleTest::ExampleTest' : cannot access private member
declared in class 'ExampleTest' */
int troz = zug( ) ;
return troz;
}
Насколько я могу судить, во всех этих случаях временный ExampleTest должен быть передан конструктору функции как rvalue. Однако компилятор хочет их скопировать.
Что дает? Возможно ли передать объекты-конструкторы (но с возможностью перемещения) в конструктор std:: function? Есть обходные пути с указателями и так далее, но я хочу понять, что здесь происходит.
Конкретные ошибки, приведенные выше, относятся к Visual Studio 2012 с патчем CTP С++ 11. GCC 4.8 и Clang 3 также падают с собственными сообщениями об ошибках.