2009-09-05 4 views
4

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

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

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

void somefunc2(char &char1) 
{ 
    return; 
} 

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

somefunc2(Key); 

[bcc32 Error] unit1.cpp (830): E2357 Reference инициализируется беззнаковое короткое ', требуется lvalue типа' char '

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

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

somefunc2(*(char*)&Key) 

это решает проблему.

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

+0

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

+0

Извините, это в пятницу вечером. Я закрепится через секунду. – Andrew

+1

Что такое 'Word'? Является ли это целым типом или объектом? – strager

ответ

4

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

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

void somefunc2(const char &char1) 
{ 
    return; 
} 
+2

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

+1

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

10
WORD &Key; 

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

WORD &Key = alreadyExistingKey; 

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

EDIT:

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

[bcc32 Error] unit1.cpp (830): E2357 Ссылка, инициализированная «беззнаковым коротким», требуется l значение типа «char»

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

Мне кажется, что ваш «с-стиль» лекарство жестоко переосмысления &Key, которая является адресом из unsigned short, как адрес в char. То, что вы переходите на somefunc2, является поэтому первым байтом Key, который интерпретируется как (подписанный) char. Я предполагаю, что результат зависит от сущности. Я бы не стал полагаться на этот код.

+0

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

+0

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

+0

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

Смежные вопросы