On 11/10/14 6:33 PM, Mike wrote:
First of all, what exactly is planned for deprecated? It [1] says "Note
that scope for other usages (e.g. scoped variables) is unrelated to this
feature and will not be deprecated.", but the example...

void main()
{
     A obj;
     {
         scope A a = new A(1);
         obj = a;
     }
     assert(obj.x == 1);  // fails, 'a' has been destroyed
}

.... looks a lot like a scoped variable to me, so it's not clear to me
what exactly is planned for deprecation. Please clarify.


Ok, with that out of the way, I get why it is unsafe, but isn't it only
unsafe because it has not yet been implemented?  Isn't it possible to
implement escape analysis and make it a safe and useful feature?

This question was asked before, but never received an answer.[2]

Mike

[1]
http://dlang.org/deprecate.html#scope%20for%20allocating%20classes%20on%20the%20stack

[2] http://forum.dlang.org/post/k549l4$1s24$1...@digitalmars.com

Well, that's a funny thing. I looked it up, apparently using scope to designate "scope variables" is a thing:

http://dlang.org/attribute.html#scope

" For local declarations, scope implements the RAII (Resource Acquisition Is Initialization) protocol. This means that the destructor for an object is automatically called when the reference to it goes out of scope. The destructor is called even if the scope is exited via a thrown exception, thus scope is used to guarantee cleanup. "

Anyone used to using structs for RAII would think WAT? But a long time ago, structs did not have dtors. So I think at that time, scope simply applied only to classes. Note how it specifically says "objects"

What I think it means is, scope declarations for allocating classes will be destroyed when leaving scope, but will not be allocated on the stack.

I don't know why this is less dangerous. Perhaps it's destroyed but not deallocated?

But the deprecation says "(e.g. scoped variables) is unrelated to this feature." Seems pretty related.

My real guess is that the deprecation message is wrong. We have scope(exit), I don't see why we would need scope variables as well.

-Steve

Reply via email to