将左值绑定到引用

时间:2009-09-05 02:56:33

标签: c++ reference bind lvalue

我认为我在这个问题的理论背景中错过了。我知道有类似的帖子,但我仍然没有得到它。

我有这样的代码:

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 )

它解决了一个问题。

任何人都可以提示我出了什么问题,为什么会出错?

2 个答案:

答案 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;
}