理解右值引用的c++语法
c++ syntax in understanding rvalue references
我正在阅读Thomas Becker写的一篇关于c++11右值引用的博客,页面底部的语法真的让我很困惑。
int& foo();
foo() = 42; // ok, foo() is an lvalue
foo
到底是什么?返回int
的函数指针;一个对象?
如果是一个函数对象,你如何给它赋值,为什么foo
是左值?
int& foo();
声明了一个函数foo
,它不接受任何参数,并返回一个对int
的引用。例如,
#include <iostream>
int a = 0;
int& foo();
int main()
{
std::cout << a << std::endl;
foo() = 42;
std::cout << a << std::endl;
}
int& foo() { return a; }
输出:0
42
foo
是返回类型为int&
的函数。行
int& foo();
简单地声明函数,但不定义它。
当调用foo
时,结果为int
类型的左值。因此,您可以将其指定为:foo() = 42;
每个函数至少有一个返回表达式。让我们使用以下不完整的简化描述来查看函数调用:
假设函数签名是T f();
,有一个返回表达式return e;
。为了简单起见,我们还假设e
和T
在删除引用和const
-ness之后具有相同的类型。在这种情况下,您可以转到函数调用位置并用(T)e
替换f()
调用,以了解发生了什么。
int& f(){....; return e;}
.
.
.
f() = 5;
是
(int&)e = 5;
当然,如果将e
转换为左值引用(int&
)无效,编译器将抛出错误。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 创建模板嵌套类实例的语法?
- C++语法差异:二维和一维数组(指针算术)
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么