有人可以解释 ref( ) vs & 在 c++11 中以及何时使用它们吗?
Can someone explain ref( ) vs & in c++11 and when to use each?
我阅读了相关文档,但如果有人能用更简单的英语解释一下,我将不胜感激。
普通c++引用&
是一个奇怪的公民,因为它可以初始化但不能重新赋值。例如:
int a, &ra = a;
int b, &rb = b;
ra = rb; // actually does a = b
普通指针是一个良好的公民,它既可以初始化,也可以重新赋值。
因此,ref()
创建了reference_wrapper
,这是一个普通指针的包装器。这个包装器可以用引用初始化,并且它可以自动转换为普通引用&
,例如:
int a;
auto ra = std::ref(a);
int b;
auto rb = std::ref(b);
ra = rb; // now ra contains a pointer to b
int& rb2 = ra; // automatically converts to reference
它主要用于使用lambdas或std::bind
表达式的函数式编程。std::bind
复制绑定参数,因此如果您想将函数参数绑定到引用,reference_wrapper
很方便。例如:
void foo(int);
int i = 1;
auto f = std::bind(foo, i); // makes a copy of i
i = 2;
f(); // calls foo(1)
auto g = std::bind(foo, std::ref(i));
i = 3;
g(); // calls foo(3);
相关文章:
- 何时使函数成为类成员函数C++?
- 使 C++14 constexpr 函数C++11 兼容
- 何时必须使操作员<<过载?
- 如何使用 std::vector 在 c++11 中使其更快?
- 使 c++11 Dijkstra 实现返回最短路径
- 围绕Typedef U8进行使用以使用C 11 U8字符串文字
- 何时在C 11 lambda的定义中捕获需要捕获的变量
- C++11:编译器何时将 {} 视为 std::initializer_list,何时不考虑?
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- 呼叫IASetVerteXbuffers会使以后对设备上下文的所有呼叫造成访问违规(DX 11)
- C++11 fgetc 在"r+b"模式下使用时向我的文件输出 0
- C++11 何时相对于运算符优先级进行算术类型转换
- 如何使QTCreator与C 11一起使用
- 我能否使 C++11 类/对象通用线程安全?
- 在C++11标准中,它在哪里指定了在翻译过程中何时可以计算constexpr函数
- GNU C 何时支持C 11,而无需明确要求
- 如何使C++11函数生效<>参数自动接受lambdas
- 何时解析 C++11 lambda 表达式中的变量引用
- 新括号后的存在,使C++11中的任何不同
- 何时使用C++11互斥、锁、unique_lock、shared_lock等