Неверная инициализация неконстантной ссылки типа

В следующем коде я не могу передать временный объект в качестве аргумента 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 … Есть ли способ преобразовать мое lValue в rValue с помощью std :: move или чего-то еще? Я пытался принять постоянный параметр, но это не похоже на работу.

16

Решение

Просто заставьте вашу функцию печати принять ваш аргумент const&, Это также логически правильно, поскольку это не меняет ваш аргумент.

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

Актуальная проблема в другом. Вы передаете временное значение (rvalue) функции, которая ожидает lvalue.

15

Другие решения

Или, если у вас есть компилятор, совместимый с C ++ 11, вы можете использовать так называемый универсальный ссылочный подход, который с помощью правил свертывания ссылок может связываться с ссылками как lvalue, так и rvalue:

#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;
}
10

Ваш код не работает, если вы запускаете компиляторы 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;
}
-2
По вопросам рекламы [email protected]