Недопустимая инициализация неконстантной ссылки типа
в следующем коде я не могу передать временный объект в качестве аргумента 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 или что-то еще? Я попытался взять постоянный параметр, но это, похоже, не работает.
3 ответов
просто сделайте свою функцию печати аргументом const&
. Это также логически правильно, поскольку это не изменяет ваш аргумент.
void printAge(const Person &person) {
cout << "Age: " << person.age << endl;
}
фактическая проблема заключается в обратном. Вы передаете временное (rvalue) функции, которая ожидает lvalue.
или, если у вас есть компилятор, совместимый с 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;
}
ваш код не работает, если вы запускаете компиляторы g++ или gcc. Вам нужно добавить const
to 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;
}