我知道以下功能
template <typename T>
void do_something(T&& arg);
函数参数是转发参考。但是在下面的情况下,它仍然是转发参考或rvalue参考吗?
template <typename T>
class MyClass
{
void do_something(T&& arg);
};
我认为这仍然是转发参考,但我不确定。此外,如果结果不是我的意图,我想知道如何执行RVALUE参考或转发参考。
这是一个rvalue参考。转发参考只能出现在推论上下文中。这只是一个会员函数,它接受RVALUE引用 class 模板参数。
,如果要维护函数的模板参数扣除,则不能强迫转发引用为RVALUE参考。如果您不介意在整个地方指定模板参数,那么这将永远而且只会给出一个rvalue参考:
template<typename T> struct identity { using type = T; };
template<typename T> void func(typename identity<T>::type&&);
回想起来,实际上有一种维护扣除的方法,但是只能接受rvalue ref被接受(除了在 simple 的答案中进行自我记录一个)。您可以提供已删除的LVALUE超载:
template<typename T>
void func(T&) = delete;
template<typename T>
void func(T&& s)
{
// ...
}
通过LVALUE时,LVALUE过载更加专业。由于被删除,将提供一个清晰的错误消息。
我喜欢知道,可以做些什么来执行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
)。