gpt4 book ai didi

c++ - std::function 在移动后是否重置其内部功能

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:28 25 4
gpt4 key购买 nike

#include <iostream>
using namespace std;

#include <functional>

template <class F>
class ScopeExitFunction
{
public:
ScopeExitFunction(F& func) throw() :
m_func(func)
{
}

ScopeExitFunction(F&& func) throw() :
m_func(std::move<F>(func))
{
}

ScopeExitFunction(ScopeExitFunction&& other) throw() :
m_func(std::move(other.m_func))
{
// other.m_func = []{};
}

~ScopeExitFunction() throw()
{
m_func();
}

private:
F m_func;
};

int main() {
{
std::function<void()> lambda = [] { cout << "called" << endl; };
ScopeExitFunction<decltype(lambda)> f(lambda);
ScopeExitFunction<decltype(lambda)> f2(std::move(f));
}
return 0;
}

不取消注释这一行 //other.m_func = []{};该程序产生此输出:

Executing the program.... $demo called terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call

std::function 在移动时不重置他的内部函数是否正常?

最佳答案

根据 C++11 20.8.11.2.1/6 [func.wrap.func.con],从现有的 std::function 对象移动构造将原始对象“留在具有未指定值的有效状态”。所以基本上不要假设任何事情。只是不要使用原始函数对象,或者如果您仍然需要它,也不要从它移动。

关于c++ - std::function 在移动后是否重置其内部功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19998389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com