繁体   English   中英

`std :: function`的简单版本:函数对象的生存期?

[英]Simple version of `std::function`: lifetime of function object?

我试图构建一个非常简单的std::function版本。 下面是第一个版本的代码。 我的问题是关于lambda表达式中的临时对象的生存期,因为我实际上是在存储对它的引用。 还是延长了物体的寿命?

它试图使用该函数的副本(在struct F使用T mf代替const T& mf ),但是由于该函数向指针的衰减而导致错误。

#include <iostream>

template<typename T>
struct F {
    F(const T& f) : mf{f} {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
    void test() {
        std::cout << __PRETTY_FUNCTION__ << '\n';
        mf();
    }
    const T& mf;
};

template<typename T>
struct F<T*> {
    F(T f) : mf{f} {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
    void test() {
        std::cout << __PRETTY_FUNCTION__ << '\n';
        mf();
    }
    T* mf;
};

void g() {
    std::cout << __PRETTY_FUNCTION__ << '\n';
}

int main() {
    F<void(void)> f1(g);
    f1.test();

    auto g1 = g;

    F f2(g1);
    f2.test();

    F f3([](){ // lifetime?
        std::cout << __PRETTY_FUNCTION__ << '\n';
    });
    f3.test();

    auto l1 = [](){
        std::cout << __PRETTY_FUNCTION__ << '\n';
    };
    F f4(l1);
    f4.test();
}

您这里确实存在生命周期问题: 由于const导致的生命周期扩展仅适用于本地 const引用

您需要确保引用的函数的生存时间至少与包装器一样长,或者需要将功能复制/移动到包装器中。


但这会由于函数衰减到指针而产生错误

您可以使用std::decay_t<T>来确保将对象(例如,闭包)复制/移动到包装器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM