在阅读有关左值和右值的 解释 时,这些代码行让我印象深刻:
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 许可协议
解释是假设
foo
有一些合理的实现,它返回对有效int
的左值引用。这样的实现可能是:
现在,由于
foo
返回一个左值引用,我们可以为返回值分配一些东西,如下所示:这将使用值
42
更新全局a
--- ,我们可以通过直接访问变量或再次调用foo
来检查: