C++ 简单版本的“std::function”:函数对象的生存期?

C++ 简单版本的“std::function”:函数对象的生存期?,c++,lambda,C++,Lambda,我试图构建一个非常简单的std::function。下面是第一个版本的代码。我的问题是关于lambda表达式中临时对象的生存期,因为我实际上存储了对它的引用。还是延长了对象的寿命 它试图使用函数的副本(T mf,而不是const T&mfinsidestruct F),但由于函数衰减到指针,因此会出现错误 #include <iostream> template<typename T> struct F { F(const T& f) : mf{f} {

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

它试图使用函数的副本(
T mf
,而不是
const T&mf
inside
struct F
),但由于函数衰减到指针,因此会出现错误

#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();
}
#包括
模板
结构F{
F(常数T&F):mf{F}{

std::cout这里确实存在终身问题:

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


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


您可以使用来确保正在将对象(例如闭包)复制/移动到包装器中。

此处确实存在生命周期问题:

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


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


可以使用以确保复制/移动对象(例如闭包)进入包装器。

您确实存在生命周期问题。您看到解决方法了吗?请尝试使用指针和引用。它们都不能确保所指向对象的生命周期。变量
f3
有一个lambda作为参数,但此lamda创建了一个无法引用的临时变量(请尝试移动)。即使从中获取指针,在计算表达式时它仍将被销毁(直到作用域结束).Solved:
std::detaction\t
如果
t
是函数,则将成员声明为函数指针。否则它将保持原来的
t
。因此,在任何情况下都会创建一个副本!并且我不必再使用部分专门化。确实存在生命周期问题。是否找到解决方法?尝试使用指针和引用s、 它们都不能确保所指向对象的生存期。变量
f3
有一个lambda作为参数,但此lamda创建了一个无法引用的临时变量(请尝试移动)。即使从该变量中获取指针,在计算表达式时它仍将被销毁(甚至直到范围结束).Solved:
std::decay\u t
如果
t
是函数,则将成员声明为函数指针。否则它将保持
t
的原样。因此,在任何情况下都会创建一个副本!我不必再使用部分专用化。