【问题标题】:Binding lvalue to a reference将左值绑定到引用
【发布时间】:2009-09-05 02:56:33
【问题描述】:

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

我有这样的代码:

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 )

它解决了一个问题。

谁能提示我哪里错了,为什么错了?

【问题讨论】:

  • 请提供完整的c++代码。您提供的代码应该声明我采用的函数,但错过了返回类型。我认为,一个完整的、应该可以工作的 C++ sn-p 会更好地帮助你
  • 对不起,星期五晚上。我会在一秒钟内修复。
  • 什么是Word?是整数类型还是对象?

标签: c++ reference bind lvalue


【解决方案1】:
 WORD &Key;

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

 WORD &Key = alreadyExistingKey;

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

编辑:

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

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

编译器告诉您somefunc2 期待[引用,即别名]char。但是 somefunc1 中的 KeyWord,我理解它是 unsigned short 的 typedef。

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

【讨论】:

  • 能否请您也提示一下在这种情况下该怎么做?这些只是我无法更改的两个函数(无法访问源代码),而这种隐式转换我不是很喜欢但必须处理。我猜 reinterpret_cast 很可能会是同样的残酷方法?
  • @Andrew:如果您无法访问源代码并且函数没有一起编译,那么您到底有什么?如果不是“这些功能”,您发布的来源是什么?
  • @Andrew:要推荐你应该做什么,我们首先需要知道这些函数是如何使用数据的。假设标准数据大小,您有一个对 2 个字节数据的引用,您试图将这些数据传递给一个仅引用 1 个字节的函数。我们不知道应该传递哪个字节。此外,我们不知道 somefunc2 是否修改了引用的字节,如果修改了,那么我们不知道其他数据字节会发生什么。有多种方法可以编写 somefunc1,具体取决于它的实际用途。
【解决方案2】:

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

你应该这样写的:

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

【讨论】:

  • 很好的回应!简洁明了。它有助于理解我所知道的违规行为。现在看来很明显了。
  • 这里的临时变量在哪里(即哪个变量/引用)?
猜你喜欢
  • 2014-10-31
  • 2017-12-06
  • 2017-04-13
  • 2010-11-23
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多