次のコードはセグメンテーションフォールトを示しています。それをデバッグした後、関数ではなくラムダをautoと宣言することで問題を解決できることがわかりました。それはなぜですか?std :: functionとしてラムダを格納する際のセグメンテーションエラー
#include <functional>
#include <iostream>
#include <vector>
typedef std::vector<double> Vec;
typedef std::function<const Vec&(Vec)> Function;
int main()
{
//Function func = [](const Vec& a)->Vec /*this give me segfault*/
auto func = [](const Vec& a)->Vec /*this work just fine??*/
{
Vec b(2);
b[0] = a[0] + a[1];
b[1] = a[0] - a[0];
return b;
};
Vec b = func(Vec{1,2});
std::cout << b[0] << " " << b[1] << "\n";
return 0;
}
私は は、いくつかの他のクラスには、このラムダ式を渡すしたいと思いますので、私は機能としてそれを宣言することができればそれは素晴らしいことです。 FUNCは関数として宣言されたときに、私が持っている
エラーは次のとおりです。
プログラムは、信号SIGSEGV、セグメンテーションフォールトを受けました。 /usr/include/c++/5/bits/stl_vector.h:655のstd :: vector> :: size(this = 0x0)の0x0000000000401896が返されます。{return size_type(this - > _ M_impl._M_finish - this - > _ M_impl。 _M_start); }
のstd :: vector> :: vector(this = 0x7fffffffdc50、__x =)
(GDB)バックトレース
#0 0x0000000000401896 STDで::ベクトル> ::サイズ(これは0x0の=)/usr/include/c++/5/bits/stl_vector.h:655
#1 0x00000000004015aa中で/usr/include/c++/5/bits/store/vector.h:320の の
test.cxxのmain()の#2 0x0000000000400d12:18