我认为我在这个问题的理论背景中错过了。我知道有类似的帖子,但我仍然没有得到它。
我有这样的代码:
void somefunc1(Word &Key)
{
somefunc2(Key);
}
void somefunc2(char &char1)
{
return;
}
编译器在这里生成错误:
somefunc2(Key);
[BCC32错误] Unit1.cpp(830):E2357使用'unsigned short'初始化的参考,需要'char'类型的左值
我发现这是因为ANSI 2003关于C ++处理临时和引用的规定,但我仍然没有得到错误。
当我进行c风格转换时:
somefunc2( *(char*)&Key )
它解决了一个问题。
任何人都可以提示我出了什么问题,为什么会出错?
答案 0 :(得分:10)
WORD &Key;
对于某些其他对象,引用始终是别名,并且必须使用已存在的对象对其进行初始化。因此,上述声明无效。以下是正确的:
WORD &Key = alreadyExistingKey;
[以上不再相关,问题已经改变。]
修改强>
void somefunc1(Word &Key)
{
somefunc2(Key);
}
void somefunc2(char &char1)
{
return;
}
[BCC32错误] Unit1.cpp(830):E2357使用'unsigned short'初始化的参考,需要'char'类型的左值
编译器告诉您somefunc2
期待[引用,即a char
的别名。但Key
中的somefunc1
却是Word
,我理解为unsigned short
的typedef。
在我看来,您的“c风格”补救措施会残酷地重新解释&Key
unsigned short
的地址,作为char
的地址。因此,您传递给somefunc2
的内容是Key
的第一个字节,解释为(已签名)char
。我想结果取决于字节序。我不会依赖那段代码。
答案 1 :(得分:4)
Temporaries不能绑定到非常量引用。
你应该写下这个:
void somefunc2(const char &char1)
{
return;
}