Weed пишет: > Denis Koroskin пишет: >> On Sun, 11 Jan 2009 05:04:11 +0300, Weed <resume...@mail.ru> wrote: >> >>> Bill Baxter пишет: >>>> 2009/1/11 Weed <resume...@mail.ru>: >>>>> Bill Baxter пишет: >>>>> >>>>>> But since classes can be polymorphic, value copying gets you into >>>>>> slicing problems. That's why value copying is disabled to begin with. >>>>>> So disabling value copies is a good thing. >>>>> It is not always a good thing. >>>> Yeh, I just mean there is some merit in disabling value copies. But I >>>> don't rule out the possibility that there may be an even better way >>>> that banning them altogether. >>>> >>>>> I propose to prohibit only the copying by value of the base type to >>>>> derivative type >>>> Ok, this is key. How do you propose to do this? In general it >>>> requires a runtime check, I think. >>>> And I think you need to say that you prohibit copying unless >>>> typeA==typeB exactly. If you allow copying either way between base >>>> and derived you are asking for trouble. >>>> >>>> But still given >>>> Base x = get_one(); >>>> Base y = get_another(); >>>> *x = *y; // presumed value copy syntax >>>> >>>> you have no way in general to know that x and y are really both a Base >>>> at compile time. So you must have a run-time check there. Perhaps it >>>> could be omitted for -release builds, though. >>> It can lead to a difficult and non-reproduceable errors than old >>> C++-style splitting. >>> >>> It is possible to try to prohibit assignment of the dereferenced >>> pointers? Simply to prohibit assignment too it is possible, essentially >>> it changes nothing. >>> >> Err.. I don't get what you say. The *x = *y is just one of the possible >> syntaxes, nothing else. >> > > (I have incorrectly expressed) > > If dereferencing was not used in lvalue or rvalue and is both a classes > by value it is possible to assignment, except cases when the base type > to the derivative is assigned. > > Example: > > class C {} > class C2 : C {} > > C c(); > C2 c2(); > > C* c_p = &c; > C2* c2_p = &c2; > > c = c2; // ok > c2 = c; // err > *c_p = *c2_p; // err > *c2_p = *c_p; // err > c2 = *c2_p; // err > > and: > c = c2 + *c2_p; // ok > >>>>>> And that's also the problem with putting scope'd things inside another >>>>>> class or an array. Since they don't have value semantics, >>>>> Yes, this is what I mean >>>> So assuming you had this, the important question is what would you do >>>> with it? >>> The most difficult. My arguments: >>> >>> 1. Problem of a choice of correct type for the object. A mathematical >>> matrix - a classical example. A class it should be or structure? >>> >>> My offer without serious consequences allows to move solution of this >>> problem from a design stage to a programming stage - is it will be >>> simple by replacement keyword class to struct. >>> >> Having the same syntax for both classes and struct is a nice goal, I agree. >> But it should be taken as a different issue and solved separately, too. > > So I offer: the inheritance of structures this one of offers, which in > itself it seems insignificant, but useful if to make classes by value. > >>> 2. Performance increases. It is not necessary to allocate at the >>> slightest pretext memory in a heap. >>> >>> >>> 3. I offer syntax which presumably does not break an existing code. >>> + On how many I understand, in the existing compiler all necessary for >>> implementation already is, a problem only in syntax addition. >>> >>> >>> 4. Java and C# also uses objects by reference? But both these of >>> language are interpreted. I assume that the interpreter generally with >>> identical speed allocates memory in a heap and in a stack, therefore >>> authors of these languages and used reference model. >>> >> Neither of these languages are interpreted, they both are compiled into >> native code at runtime. > > Oh!:) but I suspect such classes scheme somehow correspond with > JIT-compilation. > >>> D is compiled language and to borrow reference model incorrectly. In D >>> the programmer should have possibility most to decide where to place >>> object. >>> >>> >>>> You still have the problem that the current system works pretty well. >>>> And has a lot of history. So you need a very compelling use case to >>>> convince Walter that something should change. >>> Thus, actually Java and C# systems works pretty well. And they has a lot >>> of history. But not D. >>> >> DMD 0.001 was released 7 years ago. Long enough, I think. > > Yes, I know. > I hint at that that it seems this scheme have copied because it is > popular but have not considered characteristic for C++-like compiled > language nuances.
So? Revising of objects is necessary? We agree at least with it?