如何在没有模板的情况下将左值传递给仅采用右值的函数
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()
,你有两个选择:
- 提供一个临时对象,它是
i
的 copy(然后被视为 rvalue)
g(int{i})
- force 转换为 rvalue 引用
std::move()
;那么原来的i
以后一定不能再用了。
g(std::move(i))
(https://en.cppreference.com/w/cpp/utility/move)
我的问题很简单
#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()
,你有两个选择:
- 提供一个临时对象,它是
i
的 copy(然后被视为 rvalue)
g(int{i})
- force 转换为 rvalue 引用
std::move()
;那么原来的i
以后一定不能再用了。
g(std::move(i))
(https://en.cppreference.com/w/cpp/utility/move)