Прочитать эту статью: Появление и исчезновение констант в C ++
Вывод типов для автоматических переменных в C ++ 0x по существу такой же, как для шаблона параметры. (Насколько мне известно, единственное различие между ними состоит в том, что тип автоматических переменных можно выводить из списков инициализаторов, в то время как типы параметров шаблона могут не быть.) Каждая из следующих деклараций поэтому объявляет переменные типа int ( never const int):
blockquote>auto a1 = i; auto a2 = ci; auto a3 = *pci; auto a4 = pcs->i;
При выводе типа для параметров шаблона и автоматических переменных удаляются только константы верхнего уровня. Если шаблон функции принимает указатель или ссылочный параметр, сохраняется константа того, что указана или упоминается:
blockquote>template
void f(T& p); int i; const int ci = 0; const int *pci = &i; f(i); // as before, calls f , i.e., T is int f(ci); // now calls f , i.e., T is const int f(*pci); // also calls f , i.e., T is const int Это поведение - это старые новости, применяемые так, как это делается как на C ++ 98, так и на C ++ 03. Соответствующее поведение для автоматических переменных, конечно, новое для C ++ 0x:
blockquote>auto& a1 = i; // a1 is of type int& auto& a2 = ci; // a2 is of type const int& auto& a3 = *pci; // a3 is also of type const int& auto& a4 = pcs->i; // a4 is of type const int&, too
Поскольку вы можете сохранить cv-квалификатор, если тип является ссылкой или указатель, вы можете сделать:
auto& my_foo2 = GetFoo();
Вместо того, чтобы указывать его как
const
(то же, что и дляvolatile
).Изменить: Что касается причины
auto
выводит возвращаемый типGetFoo()
как значение вместо ссылки (что было вашим основным вопросом, извините), рассмотрите это:const Foo my_foo = GetFoo();
Вышеупомянутое создаст копию, так как
my_foo
ценность. Еслиauto
должен был вернуть ссылку на lvalue, это было бы невозможно.
Нельзя создать переменную events
в методе componentDidMount
и получить к ней доступ в методе render
. Вместо этого вы можете непосредственно создать переменную events
в методе рендеринга, поскольку она будет перезапущена, когда ваш запрос fetch
будет выполнен и состояние обновлено.
Также убедитесь, что вы установили eventData
для пустого массива в начальном состоянии, а не для пустого объекта, иначе вы получите ошибку, пытаясь использовать для него метод map
.
export default class EventsPage extends Component {
constructor(props) {
super(props);
this.state = {
eventData: [],
isLoggedin: true
};
}
componentDidMount() {
fetch("http://localhost:5999/events/" + this.props.match.params.userId, {
headers: {
"Content-Type": "application/json"
},
method: "GET",
mode: "cors",
credentials: "include"
})
.then(response => response.json())
.then(data => {
if (data["code"] === 200) {
console.log("OK");
this.setState({
eventData: data.events_data,
isLoggedin: true
});
} else {
console.log("NOT OK");
this.setState({
eventData: data.events_data,
isLoggedin: false
});
}
});
}
render() {
let events = this.state.eventData.map(event => (
<Events
name={event.name}
image_url={event.image_url}
start_time={event.start_time}
end_time={event.end_time}
price={event.price}
age_from={event.age_from}
age_to={event.age_to}
x_coord={event.x_coord}
y_coord={event.y_coord}
status={event.status}
status_id={event.status_id}
members_total={event.members_total}
members_needed={event.members_needed}
owner_id={event.owner_id}
address={event.address}
/>
));
return <>{events}</>;
}
}