c++ - 无法在成员函数中将左值绑定到右值,但在全局函数中可以
问题描述
在查看std::forward的参考页面时,我遇到了一些奇怪的事情。该示例将左值作为右值引用传递......但传递给全局函数......并且它编译并运行。我尝试了与成员函数相同的操作,但无法编译。是什么赋予了?std::move
如果不使用or ,我希望这两个调用都会失败std::forward<T>
。
#include <iostream>
template <typename T>
void globalDoSomething(T &&data) {
std::cout << "We're doing it!!" << std::endl;
}
template <typename T>
class A {
public:
void doSomething(T &&data);
};
template <typename T>
void A<T>::doSomething(T &&data)
{
std::cerr << "Ah, man. I won't compile." << std::endl;
}
template class A<int>;
int main()
{
int b = 0;
globalDoSomething(b);
A<int> a;
a.doSomething(b);
return 0;
}
解决方案
这是因为自动模板推导globalDoSomething
推断T
为int&
.
如果你globalDoSomething<int>(b);
像对模板类的成员函数那样显式地实例化模板函数,它也将无法编译。
相反,如果用 实例化模板类A<int&> a;
,它将成功编译。
推荐阅读
- javascript - 在数组中查找键
- java - 单击或悬停在分层透明组件上时如何防止奇怪的绘画伪影出现?
- python - 估计矩形物体的姿态是不稳定的
- sql - 查询以检测前一天物品位置的变化(RFID 跟踪)
- html - 使用 go 解析 HTML 中的标签
- python - 根据另一个数组中的可用范围调整一个 numpy 数组
- python - Heroku中的python套接字服务器
- laravel - 访问特定嵌套页面时,VueJS / Laravel 的相对路径不起作用(路由器历史记录开启)
- php - 有关此问题专辑照片 laravel 画廊的更多信息。更新相册中的照片时出错
- javascript - 删除音频文件之间的时间