4

我想我在这件事上的理论背景中错过了一些东西。我知道有类似的帖子,但我仍然不明白。

我有这样的代码:

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

void somefunc2(char &char1)
{
    return;
}

编译器在这里给我一个错误:

somefunc2(Key);

[BCC32 错误] Unit1.cpp(830):E2357 引用初始化为“无符号短”,需要“字符”类型的左值

我发现这是因为 ANSI 2003 关于 C++ 处理临时和引用的规定,但我仍然不明白这里有什么问题。

当我进行 c 风格转换时:

somefunc2( *(char*)&Key )

它解决了一个问题。

谁能暗示我出了什么问题,为什么错了?

4

2 回答 2

10
 WORD &Key;

引用始终是某个其他对象的别名,并且必须使用已存在的对象对其进行初始化。因此,上述声明无效。以下是正确的:

 WORD &Key = alreadyExistingKey;

[以上不再相关,问题已经改变。]

编辑:

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

[BCC32 错误] Unit1.cpp(830):E2357 引用初始化为“无符号短”,需要“字符”类型的左值

编译器告诉你,这somefunc2是期待 [a 引用,即别名] a char。但是Keyinsomefunc1是 a Word,我理解它是unsigned short.

在我看来,您的“c 风格”补救措施正在粗暴地重新解释&Key,即 a 的地址unsigned short,作为 a 的地址char。因此,您传递给somefunc2的是 的第一个字节Key,解释为 (signed) char。我想结果取决于字节顺序。我不会依赖那个代码。

于 2009-09-05T03:01:47.997 回答
4

临时对象不能绑定到非常量引用。

你应该这样写:

void somefunc2(const char &char1)
{
  return;
}
于 2009-09-05T06:29:46.297 回答