c++ - 转换运算符模板是否有意T&&() 是转换为右值吗?
问题描述
我正在编写一个转换运算符,用于将类转换为左值或右值。所以我假设:
struct C
{
int x;
template<typename T>
operator T&&() {
return std::forward<T>(x);
}
};
int main() {
C x;
int&& rv_i = std::move(x);
int rv_i2 = x;
//int& rv_i3 = x; // fails
}
会添加两者。我很惊讶它只添加了一个转换运算符,该运算符转换为 type 的右值T
。这是标准故意的还是这是 g++、clang++ 和 VC++ 中的错误?
因此,它再次需要复制更多功能。:(
解决方案
我想你问错问题了。
首先让我们介绍一下价值类别的角度。调用运算符的结果是一个左值(如果它返回T&
),一个纯右值(如果它返回T
)和一个 xvalue(如果它返回) T&&
(ref)。
你真正想知道的是你的操作符返回什么类型,给定看起来像通用引用的用法。但是,它不是一个通用参考。类型的函数参数T&&
将是一个通用引用,但这并不能使该类型成为T&&
某种神奇的变色龙。在这里,您将返回一个 rvalue-ref-to-T
句点。根据上述,这会产生一个 xvalue(一种右值)。
既然我们知道运营商正在做它应该做的事情,我们怎么能做不同的事情呢?这实际上取决于您要完成的工作,但并未完全说明。但您可能正在寻找std::move
或std::forward
。
推荐阅读
- python - 从 NumPy 中的索引列表中索引多维数组
- mysql - 将数据从 MySQL 数据库部分加载到 Tableau
- excel - 如何合并行而不丢失excel中的数据
- vba - WinHttp.WinHttpRequest.5.1 URL 编码
- linux-kernel - 为什么 sys_futex 上的 kretprobe 调用频率低于相应的 kprobe?
- node.js - Puppeteer 无法识别链接
- python - 使用 super() 进行直接多重继承时保持可读性
- java - Android 我是否使用多个 ClassLoader/PathClassLoader?
- json - 请求参数 RefreshType 格式不正确
- java - 如果直接使用传递依赖,gradle build 会失败?