Не константные ссылки
Почему вы можете это сделать?
int a;
const double &m = a;
Но когда вы это делаете
int a;
double &m = a;
вы получаете сообщение об ошибке?
error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int'
Редактировать:
Чтобы быть более конкретным, я пытаюсь понять причину, по которой ссылки не-const не могут связывать временные объекты.
Ответы
Ответ 1
Это связано с тем, что временное не может связываться с неконстантной ссылкой.
double &m = a;
a
имеет тип int
и преобразуется в double
. Так создается временное. То же самое относится и к пользовательским типам.
Foo &obj = Foo(); // You will see the same error message.
Но в Visual Studio он отлично работает, потому что по умолчанию расширение компилятора включено. Но GCC будет жаловаться.
Ответ 2
Поскольку внесение изменений во временное значение бессмысленно, c++ не хочет, чтобы вы связывали неконстантную ссылку на временную. Например.
int a;
double &m = a; // caution:this does not work.
Что делать, если это работает? a
имеет тип int и преобразуется в double. Так создается временное.
Вы можете изменить m
, связанный с временным, но почти ничего не происходит. После модификации переменная a
не изменяется (что еще хуже, вы можете подумать, a
она изменилась, что может вызвать проблемы).