这段代码是取消引用指针还是做其他事情?

Is this code dereferencing a pointer or doing something else?

我以前从未见过这种事情 - 我对 shared_ptr 有点陌生 - 这是一个典型的共享指针操作,还是有人在这里做了一些奇特的事情?它看起来不像是取消引用 - 它看起来更像是有人试图确保 operator->() 已定义...

我已经用我能想到的很多方法对此做了 google/duckduckgo,在网上找不到任何好的例子。

谢谢。

void fn(std::shared_ptr<int> data){
if(data.operator->() == NULL){
return; //this is an error
}

....//rest of function, doesn't matter

}

来自

T* operator->() const noexcept;

您正在访问 shared_ptr 的内部指针。如果它不为 NULL,则可以读取该指针指向的数据。为此,您必须使用:

T& operator*() const noexcept;

所以当你想检查shared_ptr是否指向一些数据并读取它时,你可以这样写:

void fn(std::shared_ptr<int> data) {
    if(data.operator->() == NULL) // dereference pointer
       return; //this is an error

    int value = data.operator*(); // dereference data pointed by pointer
}

上面的代码是使用 shared_ptr 实例的奇特方式。您可以通过应用 @obj:

来使用较短的形式,而不是像成员函数那样调用运算符 - obj.operator @()
 // this code does the same thing as above
void fn2(std::shared_ptr<int> data)
{
    if(!data)
       return; //this is an error

    int value = *data;
    std::cout << value << std::endl;
}

更多详情,see reference