【发布时间】:2015-02-10 15:47:06
【问题描述】:
编辑:更新代码使两个函数更加相似
我在 lambda 函数中使用犰狳类型时遇到问题,当尝试读取无效内存位置时会导致崩溃。如果我将相同的表达式移到普通函数中,一切都会顺利进行。
所以,简单的工作示例:
#define ARMA_USE_CXX11
#include <armadillo>
using namespace arma;
rowvec2 funcLambda( double value, const rowvec2 &vA, const rowvec2 &vB, const double &const1, const double &const2 ){
return min( vA * const1, vB * const2 );
}
int main( void ){
rowvec2 vA = {.12, .44};
rowvec2 vB = {2, 2};
auto const1 = double( 1.2 );
auto const2 = 3.1;
auto fLambda = [&]( double value ){ return min( vA * const1, vB * const2 );};
rowvec2 z = rowvec2({0.0, 0.0});
// This works fine
z = funcLambda( 100, vA, vB, const1, const2 );
// This crashes
z = fLambda( 100 );
return 1;
}
这个例子在note所在的地方崩溃,有没有“using namespace arma;”包括行,有和没有#define ARMA_USE_CXX11,并使用32位和64位内存寻址。
我不知道是我在 lambda 函数中做错了什么,还是犰狳导致了问题。如果我删除等式的一部分(例如标量的乘法),它将正常工作。
感谢任何帮助。
谢谢
亨里克
【问题讨论】:
-
我看到了两个不同之处。首先,lambda 中的引用是
const&,而在函数中它们是&。其次,funcLambda进行构造,而fLambda进行赋值。如果消除这些差异,行为会改变吗? -
@Yakk:我在函数中更改了对 const& 的引用,并使两个函数调用都进行了赋值。虽然结果相同。原始问题中的代码已更新。
标签: c++ lambda crash armadillo