如何在没有模板的情况下将左值传递给仅采用右值的函数

How to pass lvalue to function taking rvalue only without templates

我的问题很简单

#include <iostream>

using namespace std;

template <typename T>
void f(T&& i) {
        cout << i << endl;
}

void g(int&& i) {
        cout << i << endl;
}

int main() {
        int i = 0;
        f(i); // works fine
        g(i); // candidate function not viable: no known conversion from 'int' to 'int &&'
              // for 1st argument void g(int&& i)

}

为什么我可以将左值传递给模板函数 f() 而不是非模板函数 g()

R 值引用自 c++ 11 起定义,您应该将编译器版本更改为 c++ 11。

请查看this link

您的 f() 函数不需要 rvalue,而是 forwarding 引用。
尽管 f()g() 看起来非常相似(由于 && 符号),但它们非常不同。
(参见示例

如果你真的想把i传给g(),你有两个选择:

  • 提供一个临时对象,它是 icopy(然后被视为 rvalue
    g(int{i})
  • force 转换为 rvalue 引用 std::move();那么原来的i以后一定不能再用了。
    g(std::move(i))
    (https://en.cppreference.com/w/cpp/utility/move)