首页 > 解决方案 > 无法在成员函数中将左值绑定到右值,但在全局函数中可以

问题描述

在查看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;
}

标签: c++templatesmove-semanticsrvalue-referencemember-functions

解决方案


这是因为自动模板推导globalDoSomething推断Tint&.

如果你globalDoSomething<int>(b);像对模板类的成员函数那样显式地实例化模板函数,它也将无法编译。

相反,如果用 实例化模板类A<int&> a;,它将成功编译。


推荐阅读