*&var 是多余的吗?

Is *&var redundant?

C++ 新手,正在尝试了解 *& 的用法。

我想我明白 &*var 如果我想将一个指向指针的引用变量作为函数参数,或者只是作为一个指向指针的引用变量,那么它很有用。如果 &* 翻转了呢?

*& 在 C++ 中是多余的吗?

这是一些代码:

#include <iostream>

using namespace std;

int main(){

    // example 1
    int num = 10;
    cout << *&num; // exact same as num?

    // example 2
    struct person
    {
        string name;
        int age;
    };

    person me[3];

    me[0].name = "my name";
    me[0].age = 321;

    cout << (*&me[0]).name << endl; // exact same as me[0].name?

    return 0;
}
  1. 在两个cout中使用*&var是多余的,因为&var是一个地址,*&var表示查看地址指向的变量?

  2. 如果不是冗余的话,C++中的*&var有什么用?

大多数情况下,*&var(获取var的地址,然后取消引用该地址以访问var)和&*var(取消引用 var 以访问它指向的东西,然后获取该东西的地址)与仅使用 var 本身相同。

但是,class 类型 可以 operator& 重载到 return 它想要的任何地址,并将 operator* 重载到return 它想要的任何参考。这些是 *&var&*var 可能与 var 不同的唯一情况。例如,这在智能指针和迭代器中很常见。

为了解决前一种情况,C++11 引入了 std::addressof() 来获取对象的地址,而不管它是否重载 operator&,例如:

*&var -> *std::addressof(var)
&*var -> std::addressof(*var)