18

在以下代码中,我无法将临时对象作为参数传递给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?我尝试采用常量参数,但这似乎不起作用。

4

3 回答 3

18

只需让您的打印功能通过const&. 这在逻辑上也是正确的,因为它不会修改您的论点。

void printAge(const Person &person) {
   cout << "Age: " << person.age << endl;
}

实际的问题是相反的。您正在将临时(右值)传递给需要左值的函数。

于 2014-11-27T13:39:47.623 回答
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;
}
于 2014-11-27T16:20:27.867 回答
-2

如果您运行 g++ 或 gcc 编译器,您的代码将不起作用。您需要添加constvoid 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;
}
于 2014-11-27T14:20:08.043 回答