在下面的代码中,我无法将临时对象作为参数传递给printAge
函数:
struct Person {
int age;
Person(int _age): age(_age) {}
};
void printAge(Person &person) {
cout << "Age: " << person.age << endl;
}
int main () {
Person p(50);
printAge(Person(50)); // fails!
printAge(p);
return 0;
}
我得到的错误是:
error: invalid initialization of non-const reference of type ‘Person&’ from an rvalue of type ‘Person’
我意识到这与将lValue传递给期望rValue的函数有关...有没有办法通过使用std :: move或其他东西将我的lValue转换为rValue?我尝试了一个常量参数,但这似乎不起作用。
答案 0 :(得分:16)
只需让您的打印功能通过const&
获取您的参数。这在逻辑上也是正确的,因为它不会修改你的论点。
void printAge(const Person &person) {
cout << "Age: " << person.age << endl;
}
实际问题是另一种方式。您正在将临时(rvalue)传递给期望左值的函数。
答案 1 :(得分:10)
或者,如果你有一个符合C ++ 11的编译器,可以使用所谓的通用引用方法,通过引用折叠规则,它可以绑定到左值和右值引用:
#include <iostream>
using namespace std;
struct Person {
int age;
Person(int _age): age(_age) {}
};
template<typename T> // can bind to both lvalue AND rvalue references
void printAge(T&& person) {
cout << "Age: " << person.age << endl;
}
int main () {
Person p(50);
printAge(Person(50)); // works now
printAge(p);
return 0;
}
或者,在C ++ 14中,
void printAge(auto&& person) {
cout << "Age: " << person.age << endl;
}
答案 2 :(得分:-2)
如果您运行g ++或gcc编译器,您的代码将无法正常工作。您需要将const
添加到void printAge(const Person &person)
。但是,在Visual Studio中它可以正常工作。我已经测试了VS2010和VS2012,以下两个代码都可以正常工作。
#include<iostream>
using namespace std;
struct Person {
int age;
Person(int _age): age(_age) {}
};
void printAge(Person &person) {
cout << "Age: " << person.age << endl;
}
int main () {
Person p(50);
printAge(Person(50)); // DOES NOT fail!
printAge(p);
return 0;
}