10

これは動作します...

auto x = 4;
typedef decltype(x) x_t;
x_t y = 5;

...では、なぜこれを行わないのですか?

int j = 4;  
auto func = [&] (int i) { cout << "Hello: i=" << i << "  j=" << j << endl;};
typedef decltype(func) lambda_t;
lambda_t func2 = [&] (int i) { cout << "Bye: i=" << i << "  j=" << j << endl;};

lambda_t...そしてstd::functionを使用して手動で宣言するにはどうすればよいですか?

4

3 に答える 3

14

...では、なぜこれが機能しないのですか?

ラムダの各字句インスタンスは異なるタイプを持っているためです。同じ文字を使用してもかまいません。

..そして、std :: functionを使用してlambda_tを手動で宣言するにはどうすればよいですか?

ラムダはint引数を取り、何も返しません...したがって:

typedef std::function<void(int)> lambda_t;
于 2012-11-29T18:07:40.033 に答える
8

ラムダタイプは発話できません(名前を付けることができません)。これが、要求していることを実行できない理由です。その上、各ラムダは異なるタイプであるため、タイプに名前を付けても、2番目のラムダを最初のラムダに割り当てることはできません。ラムダ構文を、より明確になる関数オブジェクトのショートカットと考えると、メンバーoperator()はラムダごとに異なるため、タイプも異なります。

一方std::function<>、適切な署名のオブジェクトにラムダを割り当てることができます。これは、あなたの場合はですstd::function<void(int)>

于 2012-11-29T18:10:12.873 に答える
0

これが機能しないという確かな証拠があります。同様のシナリオ:

int foo = 3;
int bar = 3;

std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints one -- obviously - they are the same type

ここで、まったく同じコードを使用しますが、ラムダを使用します。どんな反応になると思いますか。

  auto foo = [](){std::cout << "HELLO\n"; };

  auto bar = [](){std::cout << "HELLO\n"; };

  std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints 0 -- different type even though they are declared exactly the same.
于 2015-04-25T00:01:07.253 に答える