混淆 L 值和 R 值括号
Confusing L-Value and R-Values parentheses
在此示例 here 的底部,定义了示例性左值:
// lvalues:
int& foo();
foo() = 42; // ok, foo() is an lvalue
int* p1 = &foo(); // ok, foo() is an lvalue
我不确定 foo()
是什么?乍一看像个function/method?
int& foo()
和int& foo;
一样吗?
但另一方面,我的编译器说
Error: 'foo' declared as reference but not initialized int & 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
是的,它是 "a function/method",返回一个对 int 的引用。或者,更准确地说,这是这样一个函数的声明,而不是定义:它说这样的函数存在,但不提供实际代码(因为代码与示例无关)。比较您如何在头文件中定义函数。
类似功能的可能代码示例:
int a, b;
int& foo(bool which) {
if (which) return a;
else return b;
}
...
foo(true) = 10; // works as a = 10;
是的,foo
确实是一个函数。这个例子只是想说 "if a function returns an lvalue reference, then the result of calling it is an lvalue."
他们可能只是想说 "there is a function foo
returning an int&
defined." 虽然从技术上讲,代码是正确的:它 在 C++ 中可以在本地声明函数:
int main()
{
int foo();
return foo();
}
int foo()
{
return 42;
}
例子是指函数调用表达式的值类别foo()
。在这种情况下,foo()
是左值,因为 foo
returns 和 int&
.
在此示例 here 的底部,定义了示例性左值:
// lvalues:
int& foo();
foo() = 42; // ok, foo() is an lvalue
int* p1 = &foo(); // ok, foo() is an lvalue
我不确定 foo()
是什么?乍一看像个function/method?
int& foo()
和int& foo;
一样吗?
但另一方面,我的编译器说
Error: 'foo' declared as reference but not initialized int & 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
是的,它是 "a function/method",返回一个对 int 的引用。或者,更准确地说,这是这样一个函数的声明,而不是定义:它说这样的函数存在,但不提供实际代码(因为代码与示例无关)。比较您如何在头文件中定义函数。
类似功能的可能代码示例:
int a, b;
int& foo(bool which) {
if (which) return a;
else return b;
}
...
foo(true) = 10; // works as a = 10;
是的,foo
确实是一个函数。这个例子只是想说 "if a function returns an lvalue reference, then the result of calling it is an lvalue."
他们可能只是想说 "there is a function foo
returning an int&
defined." 虽然从技术上讲,代码是正确的:它 在 C++ 中可以在本地声明函数:
int main()
{
int foo();
return foo();
}
int foo()
{
return 42;
}
例子是指函数调用表达式的值类别foo()
。在这种情况下,foo()
是左值,因为 foo
returns 和 int&
.