【问题标题】:Passing constant reference... does it work like most important const?传递常量引用......它是否像最重要的常量一样工作?
【发布时间】:2015-07-14 12:24:13
【问题描述】:

这是一个已知的特殊情况,如果将常量引用分配为常量引用,则它们不会在返回值中丢失:

int MyFunction()
{
    int x = 5;
    return x;
}

int main()
{
    const int& y = MyFunction();
    std::cout << "This is valid: " << std::endl;
    return 0;
}

现在,如果我有如下两个函数:

int MyFunction()
{
    int x = 5;
    return x;
}
void MyOtherFunction(const int& val)
{
    std::cout << val << std::endl;
}

int main()
{
     MyOtherFunction(MyFunction());   
}

这是否符合标准?传递 const 引用有什么限制?

【问题讨论】:

  • 是的,它有效,您可以将临时对象绑定到常量引用。限制是你不能修改val
  • 是的。如果您愿意,也可以绑定到非常量右值引用。
  • @CoffeeandCode:当然可以。您可以将其绑定到右值 ref,或者您可以安全地将 const_castconst 绑定。

标签: c++ function reference constants


【解决方案1】:

是的。

[C++14: 12.2/5]: [..] 在函数调用 (5.2.2) 中与引用参数的临时绑定一直持续到包含的 full-expression 完成通话。 [..]

【讨论】:

  • 唷。您切换到“是”。无需花费今天下午的时间进行重构 ;-) 加一,现在我有时间了。
【解决方案2】:

这也很好:标准要求匿名临时 (MyFunction()) 可以绑定到 const 引用。

(它不能绑定到非常量引用;一些编译器在这方面失效了)。

【讨论】:

  • 我很好奇;非匿名临时会是什么样子?
  • 我只是在问。叹息。
  • 所以我从 MyOtherFunction 中删除了 const,然后它就不起作用了。对吗?
  • 您的程序的行为将是未定义的。作为一名量子物理学家,我相信你可以假设那可能是什么。顺便恭喜你发现了新粒子。
  • @Bathsheba 谢谢 :-)
【解决方案3】:

它是有效的。 . 引用只是变量的别名,它代表变量存储的地址位置。

const 引用意味着你不能在你的函数中修改你的 const 参数。

在你的情况下, MyOtherFunction(MyFunction());

这里 MyFunctions 返回一个 int,它存储为匿名变量,其生命周期取决于该表达式。

【讨论】:

  • -1:错过了我们谈论通过引用绑定延长生命周期的观点。也有些歪曲了参考文献
  • Donno 我弄错了,你能详细说明一下吗? . ??谢谢你的投票。!
  • 非常感谢。 .向你致敬
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2011-03-14
  • 2014-03-03
相关资源
最近更新 更多