https://issues.dlang.org/show_bug.cgi?id=21929
--- Comment #12 from deadalnix <[email protected]> --- (In reply to Stanislav Blinov from comment #9) > (In reply to deadalnix from comment #8) > > > You'll not that C++'s std::function will allocate on heap if you capture. > > ??? std::function MAY allocate on the heap, and whether it will would depend > on its implementation and size of lambda's state. A decent implementation of > std::function surely would not allocate if all you capture is a single > reference. > > > The equivalent code in C++ WILL allocate in a loop too. > > Whether std::function would allocate is irrelevant. Equivalent C++ code > would, generally speaking, print unspecified values for all but the string: > > #include <functional> > #include <vector> > #include <iostream> > > int main(int argc, char** argv) { > std::vector<std::function<void()>> dgs; > > for (int i = 0; i < 10; i++) { > // Capture by reference, as that's D's semantics > dgs.emplace_back([&i] () { > std::cout << i << "\n"; > }); > } > > dgs.emplace_back([] () { > std::cout << "With cached variables" << "\n"; > }); > > for (int i = 0; i < 10; i++) { > int index = i; > // Capture by reference, as that's D's semantics > dgs.emplace_back([&index] () { > std::cout << index << "\n"; > }); > } > > for (auto& dg: dgs) { > dg(); > } > > return 0; > } > This code is invalid C++, whatever you deduce from it engages only yourself and does not involve C++ in any way. In fact, this code could format your hard drive and and would still be within the C++ spec. --
