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

How to pass lvalue to function taking rvalue only without templates

本文关键字:情况下 获取 值传 函数      更新时间:2023-10-16

我的问题很简单

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

您的f()函数不需要右值,而是转发引用。
尽管f()g()看起来非常相似(由于&&符号(,但它们却非常不同。
(请参阅示例通用引用和转发引用之间有区别吗?

如果您真的想将i传递给g(),您有两种选择:

  • 提供一个临时对象,它是i(然后被视为右值(
    g(int{i})的副本
  • 使用std::move()强制转换为右值引用;则以后不得使用原始i

    g(std::move(i))(https://en.cppreference.com/w/cpp/utility/move(

R值引用是从c++ 11开始定义的,你应该把你的编译器版本改成c++ 11。

请查看此链接