“int& foo()”在 C 中是什么意思?

新手上路,请多包涵

在阅读有关左值和右值的 解释 时,这些代码行让我印象深刻:

 int& foo();
foo() = 42; // OK, foo() is an lvalue

我在 g++ 中尝试过,但编译器说“未定义对 foo() 的引用”。如果我添加

int foo()
{
  return 2;
}

int main()
{
  int& foo();
  foo() = 42;
}

它编译得很好,但运行它会产生 分段错误。只是线

int& foo();

本身编译和运行都没有任何问题。

这段代码是什么意思?如何为函数调用赋值,为什么它不是右值?

原文由 Sossisos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 873
2 个回答

解释是假设 foo 有一些合理的实现,它返回对有效 int 的左值引用。

这样的实现可能是:

 int a = 2; //global variable, lives until program termination

int& foo() {
    return a;
}

现在,由于 foo 返回一个左值引用,我们可以为返回值分配一些东西,如下所示:

 foo() = 42;

这将使用值 42 更新全局 a --- ,我们可以通过直接访问变量或再次调用 foo 来检查:

 int main() {
    foo() = 42;
    std::cout << a;     //prints 42
    std::cout << foo(); //also prints 42
}

原文由 TartanLlama 发布,翻译遵循 CC BY-SA 3.0 许可协议

int& foo(); 是一个返回对 int 的引用的函数。您提供的函数返回 int 没有参考。

你可以做

int& foo()
{
    static int i = 42;
    return i;
}

int main()
{
    int& foo();
    foo() = 42;
}

原文由 Jarod42 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题