c++ - 如果参数是地址,则通用引用推导

标签 c++

关于通用引用的快速查询:

假设我有这段代码

int q = 10;
auto && wtf = &q;

这个编译很好,但我不知道幕后发生了什么。它引用了一个地址?这不是指针的工作吗?

我试图推断 auto&& 的类型是,我通过以下方式做到了:

int & test = &q //error
int && test = &q //error too

那么它会变成什么呢?我需要澄清发生了什么以及从通用引用中获取 & 的目的是什么?我这样做是因为我试图理解 std::bind,因为它可以获取地址或指针(这是被指向的地址,也就是指针的值)。

最佳答案

当您编写 &q 时,您创建了一个临时值。

An rvalue [...] is an xvalue, a temporary object (12.2) or subobject thereof, or a value that is not associated with an object. [§ 3.10]

那些最好绑定(bind)到右值引用,所以

auto && wtf = &q;

成为 &q 类型的右值引用(&&&& 保持 &&)。这不是 int,而是 int *。这就是您手动尝试失败的原因。

如果你改为绑定(bind)到一个左值,比如局部变量,那么你会得到一个左值引用:

int * qptr = &q;
auto && wtf2 = qptr;
// auto becomes (int *)&
// & combined with && becomes &

整个事情可以重新看到in action here.

关于c++ - 如果参数是地址,则通用引用推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31353610/

相关文章:

c++ - 为什么range::ostream_iterator默认可构造?

c++ - Visual C++ 2008 中的单个文件编译和执行?

c++ - 是否可以使用数组拷贝来复制 vector 的一部分?

c++ - 将私有(private)对象变量与用户输入的变量进行比较

c++ - iostream 引用如何评估为真/假

c++ - open62541:引用函数的链接器工具错误

c++ - C++ 的双重检查锁是否有任何潜在问题?

c++ - 问题 :Debuging in Visual C++ 2008 for opencv C++

c++ - 在 VC++ 中获取屏幕截图的位图对象

c++ - 一起构建 Swift、Objective-C 和静态 C++ 库