On Thursday, 27 July 2017 at 19:19:27 UTC, SrMordred wrote:
void push(T)(auto ref T value){ push(MyStruct(1));
template<class T> void push(T&& value){ push(MyStruct(1));
Those aren't the same... the D one will pass by value, the C++ one won't. D's auto ref means ref for lvalues, value for rvalues. C++ will do rvalue by ref too.
I didnt expected to see two dtors in D (this destroy any attempt to free resources properly on the destructor).
In D, you must write destructors such that they can be called on a default-initialized object. (This also means your malloc is wrong, since it doesn't perform the default initialization.)
Can someone explain why is this happening and how to achieve the same behavior as c++?
I would blit it over as raw memory then call the ctor instead of using the assign operator. That's what std.conv.emplace does..