我可以将需求参数声明为右值吗?

问题描述 投票:0回答:1

我有一个带有接收队列元素的通用回调的线程队列。这是最小化的代码:

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 )
{
    // ...
}
c++ c++20 c++-concepts
1个回答
0
投票

我也可以直接将参数实体声明为右值引用吗

当然是的(尽管它是“右值引用”,而不是“右值引用”)。

问题与所有代码相同:右值引用参数仍然是左值,除非您移动/转发它。所以这个:

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() );
}
© www.soinside.com 2019 - 2024. All rights reserved.