RVALUE参考或转发参考

  • 本文关键字:参考 转发 RVALUE c++
  • 更新时间 :
  • 英文 :


我知道以下功能

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)。

最新更新