c++ - 将左值绑定(bind)到引用

标签 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 )

它解决了一个问题。

谁能告诉我哪里出了问题,为什么会出错?

最佳答案

 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 .但是Keysomefunc1而是 Word ,据我所知是 unsigned short 的 typedef .

在我看来,您的“c 风格”补救措施正在残酷地重新解释 &Key , 这是 unsigned short 的地址, 作为 char 的地址.您要传递给 somefunc2 的内容因此是 Key 的第一个字节,解释为(签名)char .我想结果取决于字节顺序。我不会依赖该代码。

关于c++ - 将左值绑定(bind)到引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1382318/

相关文章:

C++ - boost 线程/绑定(bind)/Shared_ptr : Assert fault

c++ - 具有相同类型的模板类的模板函数友元

c++ - 在 c++ 中的 vector 中使用 vector 时访问元素的异常程序终止错误

C++ #elif 指令被丢弃

java - 检测对象是否存储状态或是否可以共享

c++ - Socket C++ 程序编译成功在运行时崩溃

c++ - 是否使用 const_cast 对 const 对象进行只读访问?

c++ - 字符串作为参数?

swift - 同一文件中的 Xcode 标记链接引用

c# - UWP : Binding selected date in calendarview