【发布时间】:2012-06-10 14:24:54
【问题描述】:
我刚刚在我的代码中发现了一个令人讨厌的错误,因为我通过引用捕获了对字符串的 const 引用。运行 lambda 时,原始字符串对象早已不复存在,并且引用的值是空的,而目的是它包含原始字符串的值,因此存在错误。
让我感到困惑的是,这并没有在运行时引发崩溃:毕竟,这不应该是未定义的行为,因为 afaik 有一个悬空引用吗?此外,在调试器下查看 id 时,它甚至看起来不像垃圾,而只是一个正确构造的空字符串。
这是测试用例;这只是打印一个空行:
typedef std::vector< std::function< void() > > functions;
void AddFunction( const std::string& id, functions& funs )
{
funs.push_back( [&id] ()
{
//the type of id is const std::string&, but there
//is no object to reference. UB?
std::cout << id << std::endl;
} );
}
int main()
{
functions funs;
AddFunction( "id", funs );
funs[ 0 ]();
}
【问题讨论】:
-
你是临时到 const-reference 绑定的又一个受害者 :(
-
是的,我已经知道了,幸运的是单元测试指出了这一点
-
您可能没有那么幸运,而且它可能一直在正常工作。想象一下编译器在调用
AddFunction之后调整了堆栈,但是临时驻留的堆栈区域仍然完好无损。然后有一天,kaboom! -
这带来了一个问题,你可以指定lambda来捕获引用或复制,但是没有办法告诉它从临时移动。
-
@Gene 确实很有趣的问题..
标签: c++ lambda c++11 undefined-behavior