我知道对于下面的函数
template <typename T>
void do_something(T&& arg);
函数参数是转发引用。但是在下面的情况下,它仍然是转发引用还是rvalue引用?
template <typename T>
class MyClass
{
void do_something(T&& arg);
};
我认为这仍然是一个转发参考,但我不确定。此外,如果结果不是我想要的,我想知道如何执行rvalue引用或转发引用。
发布于 2017-09-14 00:09:42
这是一个参考价值。转发引用只能出现在推导的上下文中。这只是一个成员函数,它接受对类模板参数的rvalue引用。
如果要维护函数的模板参数扣减,则不能强制转发引用为rvalue引用。如果您不介意在所有地方指定模板参数,那么这将始终并且永远只提供一个rvalue引用:
template<typename T> struct identity { using type = T; };
template<typename T> void func(typename identity<T>::type&&);
回想起来,实际上有一种方法可以保持扣减,但强制只接受rvalue推荐(除了Simple的答案中的自我记录)。您可以提供删除的lvalue重载:
template<typename T>
void func(T&) = delete;
template<typename T>
void func(T&& s)
{
// ...
}
当传递lvalue时,lvalue重载更加专门化。并且由于被删除,会给出一个略为清晰的错误信息。
发布于 2017-09-14 00:30:15
此外,我还想知道,如何执行rvalue引用?
如果您总是希望在推导的上下文中使用rvalue引用(而不是转发引用),则可以使用以下方法:
template<
typename T,
typename = std::enable_if_t<!std::is_lvalue_reference<T>::value>
>
using rval_ref = T&&;
template<typename T>
void foo(rval_ref<T> s)
{
// ...
}
foo
只能用rvalue调用,而T
将不是引用(也就是说,如果用std::string&&
调用foo
,那么T
将是std::string
)。
https://stackoverflow.com/questions/46213764
复制