#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
// Block 1
{
auto inc = []() { int i = 0; return [&]() { return i++; }; }();
std::vector<int> v(10, 10);
std::generate(v.begin(), v.end(), inc);
for (auto i : v) std::cout << i << std::endl;
}
// Block 2
{
auto inc = []() { int i = 0; return [&]() { return i++; }; };
std::vector<int> v(10, 10);
std::generate(v.begin(), v.end(), inc());
for (auto i : v) std::cout << i << std::endl;
}
}
なぜこれら2つのブロックが異なる結果をもたらすのかわかりません。 ラムダを使用したC++クロージャ
Block 1: 32767 ... 32776
Block 2: 0 ... 10
とstd::generate
ジェネレータ(inc
)値によって渡されたので、私はそれが正しい、問題ないはずと信じているため
私はOS Xのに
おかげで、
コード上記の結果は未定義であることに注意してください、以下を参照してくださいを実行しています。
gcc v5.1.0はどちらの場合も同じ出力を生成します – Slava
clangバージョン3.6.2でコンパイルしています。 – Ling
それはUBなので、特に出力は無関係です – Slava