I am far from being an expert C++ (or OOP) programmer still, so probably some 
of my needs look (or are) naive.

This looks related to the old discussion of a 'scoped' attribute for class 
members, but it's a different thing, more about the semantics of the code and 
less about how the compiler implements things.

Sometimes I feel the need for something (usable on class/struct/enum members) 
to tag a member as "owned" by the class instance. This attribute is useful only 
for reference attributes, like objects, structs managed by pointer, associative 
arrays and dynamic arrays. This attribute is purely a type system thing, the 
compiled code doesn't change. It just disallows some kinds of code, shown 
below. The purpose of @owned is to hopefully avoid some bugs.


class Foo {}

class Bar {
    @owned private int[] array;
    @owned private f Foo;
    
    public int[] giveArray() {
        return array; // error, a dup is required
    }
    public void receiveArray(int[] a) {
        array = a; // error, a dup is required
    }

    public Foo giveFoo() {
        return f; // error
    }
    public void receiveFoo(Foo ff) {
        f = ff; // error
    }
}


If array is owned by Bar, then "return array;" is a compile-time error because 
the memory of the array is only owned by Bar; returning a slice or reference is 
not allowed.

Is it possible to implement this @owned, and is it a good thing to have?

Bye,
bearophile

Reply via email to