混淆左值和右值括号
Confusing L-Value and R-Values parentheses
在底部的这个例子中,定义了一些典型的l值:
// lvalues:
int& foo();
foo() = 42; // ok, foo() is an lvalue
int* p1 = &foo(); // ok, foo() is an lvalue
我不知道这里的foo()
是什么?乍一看,它看起来像一个函数/方法?
int& foo()
与int& foo;
相同吗?
错误:'foo'声明为引用,但未初始化为&foo;
与右值foobar()
相同:
// rvalues:
int foobar();
int j = 0;
j = foobar(); // ok, foobar() is an rvalue
int* p2 = &foobar(); // error, cannot take the address of an rvalue
是的,它是"一个函数/方法",返回对int类型的引用。或者,更准确地说,这是这样一个函数的声明,而不是定义:它说这样的函数存在,但不提供实际的代码(因为代码与示例无关)。比较如何在头文件中定义函数。
类似函数的可能代码示例:
int a, b;
int& foo(bool which) {
if (which) return a;
else return b;
}
...
foo(true) = 10; // works as a = 10;
是的,foo
确实是一个函数。这个例子只是想说"如果一个函数返回一个左值引用,那么调用它的结果就是一个左值"。
他们可能只是想说"有一个函数foo
返回一个定义的int&
。"尽管从技术上讲,代码是正确的:在c++中可以局部声明函数:
int main()
{
int foo();
return foo();
}
int foo()
{
return 42;
}
示例指的是函数调用表达式foo()
的值类别。在本例中,foo()
是左值,因为foo
返回的是int&
。
相关文章:
- 没有找到相关文章