我知道对于下面的函数
template <typename T>
void do_something(T&& arg);
函数参数是转发引用。但是在下面的情况下它仍然是转发引用还是右值引用?
template <typename T>
class MyClass
{
void do_something(T&& arg);
};
我认为它仍然是转发引用,但我不确定。此外,我想知道如果结果不是我想要的,可以做什么来强制执行右值引用或转发引用。
最佳答案
这是一个右值引用。转发引用只能出现在推导的上下文中。这只是一个成员函数,它接受对 class 模板参数的右值引用。
如果要维护函数的模板参数推导,则不能强制转发引用为右值引用。如果您不介意在所有地方指定模板参数,那么这将始终且只提供右值引用:
template<typename T> struct identity { using type = T; };
template<typename T> void func(typename identity<T>::type&&);
回想起来,实际上有一种方法可以维持推论但只强制接受右值引用(除了 Simple 的回答中的 self 记录)。您可以提供已删除的左值重载:
template<typename T>
void func(T&) = delete;
template<typename T>
void func(T&& s)
{
// ...
}
当传递左值时,左值重载更加特殊。并且由于被删除,会给出比较明确的错误信息。
关于c++ - 右值引用或转发引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213764/