我有一个带有接收队列元素的通用回调的线程队列。这是最小化的代码:
template<typename Entity, typename Consumer>
requires requires( Consumer consumer, Entity entity ) { { consumer( std::move( entity ) ) }; }
void withCallback( Consumer consumer )
{
// ...
}
我也可以像这样直接将参数实体声明为右值引用吗:
template<typename Entity, typename Consumer>
requires requires( Consumer consumer, Entity &&entity ) { { consumer( entity ) }; }
void withCallback( Consumer consumer )
{
// ...
}
我也可以直接将参数实体声明为右值引用吗
当然是的(尽管它是“右值引用”,而不是“右值引用”)。
问题与所有代码相同:右值引用参数仍然是左值,除非您移动/转发它。所以这个:
requires ( Consumer consumer, Entity&& entity ) { consumer( entity ); }
与以下意思相同:
requires ( Consumer consumer, Entity entity ) { consumer( entity ); }
如果您想确保传递的是右值,则需要显式移动它:
requires ( Consumer consumer, Entity entity ) {
consumer( std::move(entity) );
}
或者以其他方式获取右值,最简单的是获取函数指针:
requires ( Consumer consumer, Entity&& (*entity)() ) {
consumer( entity() );
}