c++ - 右值引用或转发引用?

标签 c++

我知道对于下面的函数

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/

相关文章:

C++ 如果我将参数参数从 int* 更改为 int,这些函数的调用将如何改变

java - C++/JNI - 如何访问在 JAVA (Android NDK) 中的 .h 中声明的枚举

c++ - 如何在运行时计算 C++ 表达式类型?

c++ - 如果断言失败,策略是什么

c++ - Mac/Linux 上的 Windows 控制台应用程序? C++

c++ - 将 2 位数字的数组转换为整数 (C++)

c++ - 创建队列类时出错

.net - 如何实现一个定义规则

c++ - 如果并行执行,磁盘文件操作是否更快?

c++ - OpenCV 计算相机位置和旋转