C++ 立即按顺序使用引用运算符和解引用运算符的目的是什么&*B";?

C++ 立即按顺序使用引用运算符和解引用运算符的目的是什么&*B";?,c++,C++,我已经在我们的代码中看到过几次了,这立刻让我产生了怀疑。但由于我不知道它的初衷,所以我很犹豫是否要删除它 //requires double indirection which I won't go into FooClass::FooFunction(void ** param) { //do something } SomeClass * A = new SomeClass(); SomeClass **B = &A; FooFunction( reinterpret_cast

我已经在我们的代码中看到过几次了,这立刻让我产生了怀疑。但由于我不知道它的初衷,所以我很犹豫是否要删除它

//requires double indirection which I won't go into
FooClass::FooFunction(void ** param)
{
  //do something
}

SomeClass * A = new SomeClass();
SomeClass **B = &A;
FooFunction( reinterpret_cast<void**>(&*B) );   // what is happening here?
//需要双重间接寻址,我将不详细介绍
FooClass::FooFunction(void**param)
{
//做点什么
}
SomeClass*A=新的SomeClass();
SomeClass**B=&A;
FooFunction(重新解释投射(&*B));//这里发生了什么?

“&*B”部分就是所讨论的部分?尽管可以集成对reinterpret cast的解释,但我对cast技术非常熟悉。

我对迭代器也做过类似的事情-取消对迭代器的引用以获得引用,然后执行“&”操作符以获得指针


我不明白为什么它会在这里做任何事情。如果“&*”右侧的类型是指针类型,则它不执行任何操作。

考虑以下示例

class A {
public:
    int f() { return 55; }
};

class B {
public:
    B( A* a ) : a(a) {}
    A*& operator*() { return a; }

    A* a;
};

int main () {
    A* a = new A();
    B b = a;

    // &* calls operator*, then gets address of A
    void** x = reinterpret_cast<void**>(&*b);
    cout << reinterpret_cast<A*>( *x )->f() << endl; // prints 55

    void** x2 = reinterpret_cast<void**>( b );       // compile error
}
A类{
公众:
int f(){return 55;}
};
B类{
公众:
B(A*A):A(A){}
*&运算符*(){return A;}
A*A;
};
int main(){
A*A=新的A();
B=a;
//&*调用运算符*,然后获取
void**x=重新解释铸件(&*b);

cout f()我只能看到一个原因:
B
重载了
操作符*()
以返回
X
,但是编写代码的人需要
X*
(注意,在您的代码中,
X
A*
)这方面的典型情况是智能指针和迭代器


如果上述情况不是这样的,那么可能代码编写得足够通用,可以处理智能指针/迭代器。或者它过去使用智能指针,任何更改它的人都不会费心更改
&*
?您是否翻阅过它的历史,看看它是何时引入的,以及代码是什么样子的?

您确定吗“SomeClass**A=new A();”不包含类型?它不应该是“SomeClass*A=new A();”?您显示的代码不能是您询问的代码,因为它是错误的(
SomeClass**A=new A()
不会编译),位于对答案至关重要的地方(“什么是
A
?”)。为了得到有意义的答案,您可能需要修复此问题。此代码格式不正确。您不能使用类名作为变量的标识符。您是正确的。根据您的发现调整了代码。此问题是供参考/取消参考的。@BuckFilledPlatypus:现在确实有意义了。我已删除了我的否决票和mad如果p不是一个直指针,那么它是有意义的(尽管我将键入&(*p)作为p.get()),但它看起来像问题中的一个直接指针。如果
a
在这里是一个直接指针,那么OP的问题就没有意义了。基里尔,你是说*p得到了指向“b”的指针,然后我们通过这里的&运算符添加更多的间接操作来创建一个新指针吗?也许我误解了共享\u ptr的引入。更改示例以消除与
共享\u ptr
的误解。这不是一个真正好的示例。@sbi,因此在这种情况下,仅使用reinterpret\u cast(B)是否毫无意义?我不知道这个特定的ptr有一个重载的*运算符,所以我们似乎要为已经有双间接寻址的东西重新获得一个临时ptr?如果
B
确实是一个裸指针(类型
SomeClass**
),如您的问题所示,那么它肯定是毫无意义的。(但这也没有什么坏处。)好吧,那就回答问题了。如果这不是什么特殊情况,那么正如我所怀疑的,这确实是毫无意义的。
A* a = new A();
A** b = &a;

void** x = reinterpret_cast<void**>(&*b);  // now this is equal to the following
void** x2 = reinterpret_cast<void**>( b ); // so using &* make no sense