考虑以下代码片段。
template <typename T>
concept IsRValue = std::is_rvalue_reference_v<T>;
void funTakingRValues(IsRValue auto&& val)
{
std::cout << val << std::endl;
}
int main()
{
auto && x = 5;
std::cout << "Is rvalue reference = " << std::is_rvalue_reference_v<decltype(x)> << std::endl;
funTakingRValues(std::forward<decltype(x)>(x));
}
在这种情况下,x
根据 cout 语句结果,被视为右值引用。但依赖于相同类型特征的约束 IsRValue 不满足。发生了什么?
正如HolyBlackCat所述,
T
被推导为int
因为auto
符合&&
。要修复您的概念,您可以将右值引用添加回T
类似现在,如果
T
是,int
那么它就变成int&&
并且它通过了特征。如果int
将左值传递给函数,则T
推导为int &
,并向其添加右值引用,仍然会导致int&
引用折叠规则,并且函数将出错。你可以在这个实例中看到它的工作原理。
概念只接收
auto
没有的部分&&
,所以int
在你的情况下。请注意,由于它是一个转发引用,传递一个左值将会推断出
auto
,T &
这就是概念将接收的。