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’

これは、rValue を期待する関数に lValue を渡すことに関係していることに気付きました... std::move などを使用して lValue を rValue に変換する方法はありますか? 定数パラメーターを取得しようとしましたが、うまくいかないようです。

4

3 に答える 3

18

単純に、print 関数に引数を渡すようにします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 コンパイラを実行すると、コードが機能しません。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;
}
于 2014-11-27T14:20:08.043 に答える