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

Ank*_*lla 3 c++ templates rvalue lvalue

我的问题很简单

#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)

}
Run Code Online (Sandbox Code Playgroud)

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

pro*_*-fh 5

您的f()函数不希望有右值,而是要有转发参考。
尽管f()g()看起来非常相似(由于&&符号),但它们却截然不同。
(例如,参见通用引用和转发引用之间是否有区别?

如果您确实想传递ig(),则有两种选择:

  • 提供一个临时的对象,它是一个拷贝i(然后视为右值
    g(int{i})
  • 用; 强制转换为右值参考std::move();则此后i不得再使用原件。
    g(std::move(i))
    https://en.cppreference.com/w/cpp/utility/move