Не константные ссылки

Почему вы можете это сделать?

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 она изменилась, что может вызвать проблемы).