【问题标题】:Passing reference of parameter's (being itself a reference) target传递参数的引用(本身就是一个引用)目标
【发布时间】:2014-04-06 18:16:01
【问题描述】:

我有这样的链接方法:

PureCommand Hasher::nameToPure(CommandName& commandName) {
    return this->commandHash.find(commandName).value();
}
ByteCommand Hasher::nameToByte(CommandName& commandName) {
    return this->pureToByte(this->nameToPure(commandName));
}

第二种方法传递的是错误类型的 commandName,因为第一种方法需要引用,而不是对象。然后我尝试了这个:

ByteCommand Hasher::nameToByte(CommandName& commandName) {
    return this->pureToByte(this->nameToPure(*&commandName));
}

如此处所述:How to cast/convert pointer to reference in C++ - 因为 &commandName 给了我指针......但它再次传递了一个对象。我在做什么傻事?可能这是微不足道的事情......

【问题讨论】:

  • 如果不需要修改commandName,则通过const-ref (CommandName const& commandName) 传递。据我所知,这也将解决这个问题。
  • 如果你通过非常量引用编译器传递意味着你可以修改传入的对象,因此要求它是一个左值。这意味着您必须创建一个临时文件,该临时文件可能会被后续调用修改。
  • @dyp 成功了。我问为什么?实际上,我需要在一个函数中对其进行修改,但我已经解决了它。谢谢。 :)
  • pureToByte 是如何声明的?我怀疑这可能是实际问题。
  • @smsware 非常量左值引用不能绑定到右值。如果pureToByte 采用CommandName& this->nameToPure(..) 按值返回 是一个外参数,当你传递一个临时参数时,你会丢失这些修改(因为右值通常是临时参数)。

标签: c++ pointers reference pass-by-reference


【解决方案1】:

原始代码没有任何问题。引用可以绑定到对象。

(事实上,没有表达式有引用类型。表达式可以是左值、xvalue 或 prvalues,commandName 这里是一个左值,所以左值引用可以绑定到它。)

【讨论】:

  • 那里可能没有错,但我的编译器不同意,因为它返回的错误是对象不是引用(没有匹配的函数)。我需要按照@dyp 的建议创建 const 引用。
  • 错误:没有匹配函数调用'Hasher::pureToName(PureCommand)' - 候选是:'Hasher::pureToName(PureCommand&)'
  • 你的帖子根本没有提到pureToName
  • 对不起,复制错了,每个方法都是一样的错误。
  • 再次抱歉,我可以看到我现在做了什么...我将所有内容全部更改为 const& 并解决了问题,但是有很多错误我一定是把错误的复制到原来的问题,因为我无法真正重现以前的情况(我在途中发生了很多变化)......
【解决方案2】:

您的代码没有问题。但是你应该传递 const 引用,因为你并没有真正修改 commandName 的值。

 PureCommand Hasher::nameToPure(const CommandName& commandName) {
    return this->commandHash.find(commandName).value();
}
ByteCommand Hasher::nameToByte(const CommandName& commandName) {
    return this->pureToByte(this->nameToPure(commandName));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 2017-03-28
    • 2011-02-22
    • 2019-09-10
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多