Привязка lvalue к ссылке

#c #reference #bind #lvalue

#c #ссылка #привязка #значение lvalue

Вопрос:

Я думаю, что мне чего-то не хватает в моей теоретической подготовке по этому вопросу. Я знаю, что были похожие сообщения, но я все еще этого не понимаю.

У меня есть такой код:

 void somefunc1(Word amp;Key)
{
    somefunc2(Key);
}

void somefunc2(char amp;char1)
{
    return;
}
  

компилятор выдает мне ошибку здесь:

 somefunc2(Key);
  

[Ошибка BCC32] Unit1.cpp (830): Ссылка E2357, инициализированная ‘unsigned short’, требует значения lvalue типа ‘char’

Я выяснил, что это из-за правил ANSI 2003 о C , касающихся временных файлов и ссылок, но я все еще не понимаю, что здесь не так.

когда я выполняю преобразование в стиле c:

 somefunc2( *(char*)amp;Key )
  

это устраняет проблему.

Кто-нибудь может подсказать мне, что не так и почему это неправильно?

Комментарии:

1. Пожалуйста, предоставьте полный код на c . предоставленный вами код должен был объявлять функцию, которую я использую, но пропускает возвращаемый тип. Я думаю, что полный, предназначенный для работы фрагмент C поможет вам намного лучше

2. Извините, это вечер пятницы. Я исправлю через секунду.

3. Что такое Word ? Это целочисленный тип или объект?

Ответ №1:

  WORD amp;Key;
  

Ссылка всегда является псевдонимом для некоторого другого объекта, и она должна быть инициализирована объектом, который уже существует. Таким образом, приведенное выше объявление недопустимо. Вместо этого правильно следующее:

  WORD amp;Key = alreadyExistingKey;
  

[Вышесказанное больше не актуально, вопрос изменился.]

Редактировать:

 void somefunc1(Word amp;Key)
{
   somefunc2(Key);
}
void somefunc2(char amp;char1)
{
   return;
}
  

[Ошибка BCC32] Unit1.cpp (830): Ссылка E2357, инициализированная ‘unsigned short’, требует значения lvalue типа ‘char’

Компилятор сообщает вам, что somefunc2 ожидает [ссылку, то есть псевдоним для] a char . Но Key in somefunc1 вместо этого является a Word , который, как я понимаю, является typedef для unsigned short .

Мне кажется, что ваше средство «в стиле c» жестоко переосмысливает amp;Key , то есть адрес an unsigned short , как адрес a char . Следовательно, то, что вы передаете, somefunc2 является первым байтом Key , интерпретируемым как a (подписанный) char . Я предполагаю, что результат зависит от порядкового номера. Я бы не стал полагаться на этот код.

Комментарии:

1. Не могли бы вы, пожалуйста, также подсказать, что было бы неплохо сделать в этом случае? Это всего лишь две функции, которые я не могу изменить (у меня нет доступа к исходному коду), и такого рода неявное преобразование, я не большой поклонник, но с которым приходится иметь дело. reinterpret_cast, скорее всего, был бы таким же жестоким подходом здесь, я полагаю?

2. @Andrew: Если у вас нет доступа к исходному коду и функции не компилируются вместе, что именно у вас есть? Что является источником, который вы опубликовали, если не «эти функции»?

3. @Andrew: Чтобы рекомендовать, что вам следует делать, нам сначала нужно знать, как данные используются этими функциями. Предполагая стандартные размеры данных, у вас есть ссылка на 2 байта данных, которые вы пытаетесь передать в функцию, которая принимает ссылку только на 1 байт. Мы не знаем, какой байт следует передать. Кроме того, мы не знаем, изменяет ли somefunc2 указанный байт, и если это происходит, то мы не знаем, что должно произойти с другим байтом данных. Существуют различные способы написания somefunc1 в зависимости от того, какова его фактическая цель.

Ответ №2:

Временные файлы не могут быть привязаны к непостоянным ссылкам.

Вы должны были написать это:

 void somefunc2(const char amp;char1)
{
  return;
}
  

Комментарии:

1. Отличный ответ! Четкий и лаконичный. Это помогло понять брешь в моих знаниях. Теперь это кажется очень очевидным.

2. Где (т.е. какая переменная / ссылка) здесь является временной?