簡體   English   中英

std::bind 與 nullptr 指針

[英]std::bind with nullptr pointer

如果我將nullptr傳遞給std::bind function,我如何檢查std::function的有效性?

// Example program
#include <iostream>
#include <string>
#include <functional>

class A
{
    std::string si;
    public: 
    A(std::string s) : si(s) {}  
    
    int getData(std::string x) { 
        si += x;
        return si.size(); }
};

A* getA()
{
    return nullptr;
}

int main()
{
    auto fun = std::bind(&A::getData, getA(), std::placeholders::_1);
    
    if (getA() == nullptr)
      std::cout << "nullptr";
    
    std::cout << "output : " << fun("str");
    
    return 0;
}

上面的程序拋出分段錯誤。

無法訪問std::bind返回的 function object 的綁定參數。

你可以在綁定之前檢查指針是否為 null:

if(A* ptr = getA())
{
    auto fun = std::bind(&A::getData, ptr, std::placeholders::_1);

如果你真的需要一個 function object 其綁定 arguments 可以從外部訪問,那么你需要編寫一個命名為 function object 的類型。 例如:

struct Fun {
    A* ptr;
    int operator()(const std::string& x) {
        return ptr->getData(x);
    }
};

auto fun = Fun{ .ptr = getA() };
if (fun.ptr)
    // is "valid"
auto fun = std::bind(&A::getData, getA(), std::placeholders::_1);

您將 function object 中的A實例綁定到nullptr 因此出現分段錯誤。 您應該傳遞A的有效實例的地址(對於第二個參數),該實例的壽命將超過您創建的此 function object 的調用。

無法追溯檢查 function object 是否有效。 也就是說,在創建它之前,您必須檢查指針是否有效。

這樣的事情更有意義:

A a("hello");
auto fun = std::bind(&A::getData, &a, std::placeholders::_1);

要么

A* ptr = getA();
if (ptr)
{
    auto fun = std::bind(&A::getData, ptr, std::placeholders::_1);
    ...
}

如今,lambda 已經取代std::bind來創建 function 個對象。 你正在做的等效 lambda 是:

auto fun = [a](std::string str) { return a->getData(str); }

現在對a使用nullptr是沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM