Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过const std::function引用传递临时lambda应该失败,但似乎有效_C++_C++11_Pass By Reference - Fatal编程技术网

C++ 通过const std::function引用传递临时lambda应该失败,但似乎有效

C++ 通过const std::function引用传递临时lambda应该失败,但似乎有效,c++,c++11,pass-by-reference,C++,C++11,Pass By Reference,这是我所做工作的简化版本: #包括 #包括 阶级事务 { 公众: 无效寄存器\u fn(常数标准::函数和fn) { m_fn=fn; } 无效运行() { m_fn(); } std::函数m_fn; }; int main(){ //创建一个对象 事物t; //在有限的范围内 { //本地lambda auto afn=[]{std::cout这主要是因为您复制了函数对象 void register_fn(const std::function<void()> &fn)

这是我所做工作的简化版本:

#包括
#包括
阶级事务
{
公众:
无效寄存器\u fn(常数标准::函数和fn)
{
m_fn=fn;
}
无效运行()
{
m_fn();
}
std::函数m_fn;
};
int main(){
//创建一个对象
事物t;
//在有限的范围内
{
//本地lambda

auto afn=[]{std::cout这主要是因为您复制了函数对象

void register_fn(const std::function<void()> &fn)
{
    m_fn = fn;
}
void寄存器(const std::function&fn)
{
m_fn=fn;
}
您将
fn
分配给制作副本的
m_fn
,即使
fn
是对本地lambda的引用,制作副本意味着
m_fn
不引用
fn
,但将获得存储在其中的函数
fn
的副本。这意味着没有悬空引用,并且您的代码具有良好的性能我定义了行为


如果lambda通过引用捕获了一个本地对象,则情况会有所不同,因为在您离开声明lambda的作用域后,该捕获将变得无效。

ooh…等等-我想我刚才把自己弄糊涂了-我是通过引用传递的,但在存储它时我会复制它…最好等你们确认一下他的!:oYes,当
m_fn=fn;
@songyuanyao phew-谢谢:)我会结束这个问题,但我有一个与Scheff的问题…我投票结束这个问题,因为我只是感到困惑…仅供参考:我忽略了lambda本身不是
std::function
,而是包装到后者的一个实例中。
std::函数
实例确实有一个受限制的生存时间…作为旁白,
void register_fn(std::function fn)noexcept{m_fn=std::move(fn);}
会更好。@Deduplicator ah std::function有一个move c'tor-很好的一点:)