Destructors, const structs, and opEquals

spir denis.spir at gmail.com
Sat Dec 11 08:48:36 PST 2010


On Sat, 11 Dec 2010 09:06:33 -0500
Michel Fortin <michel.fortin at michelf.com> wrote:

> On 2010-12-10 19:32:30 -0500, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> said:
> 
> > On 12/10/10 4:10 PM, foobar wrote:
> >> Don Wrote:
> >> 
> >>> Steven Schveighoffer wrote:
> >>>> To summarize for those looking for the C++ behavior, the equivalent
> >>>> would be:
> >>>> 
> >>>> void foo(auto ref const Widget)
> >>> 
> >>> That use of 'auto' is an abomination.
> >> 
> >> I agree with don.
> >> IMHO, this is incredibly silly given Andrei's use case, since D can 
> >> have instead:
> >> void foo(const Widget);
> >> and have an optimization inside the compiler for value types to pass by ref.
> > 
> > Everyone - please stop suggesting that. It causes severe undue aliasing issues.
> 
> If I understand you well Andrei, what you want "auto ref" to be the 
> same thing as "ref" except that it would also accept rvalues. I think 
> the reason you want this is because for some types it is more efficient 
> to pass them as "ref" than by value, so you want to pass them as "ref" 
> for efficiency and and not necessarily for its semantics. And from 
> there goes the need for a "ref" that also accepts rvalues.
> 
> I think this is a bad usage of "ref". Efficient should be the way 
> arguments are passed by default, and modifiers should be used to alter 
> semantics and not required for efficiency (in most situations). Is 
> there a way to pass arguments more efficiently without introducing a 
> bazillion options the programmer then has to choose from?
> 
> Perhaps we're just trying to address the problem from the wrong end. 
> Instead of having to say for each function parameter how you want it to 
> be passed, what if the type itself knew how it should be passed as a 
> parameter?
> 
> 	@passbyref struct ArrayOf50 {
> 		float[50] content;
> 	}
> 
> 	string test1(ArrayOf50 a);     // accepts rvalues
> 	string test2(ref ArrayOf50 a); // rejects rvalues
> 
> 	void main() {
> 		test1(ArrayOf50());
> 		test2(ArrayOf50()); // error, first argument requires a reference
> 	}
> 
> Now, obviously we've given different semantics to the type itself, but 
> those semantics are going to be consistent and predictable everywhere. 
> But mostly, you don't have to remember how to pass this struct every 
> time now. That's a really big gain.
> 
> Also note how you could use this feature to design containers which 
> don't need to be reference counted but which are still passed 
> efficiently across function calls.
 
If parameters are 'in' or 'const' by default, then whether they are passed by value or by ref has no consequence, I guess. The compiler can then safely choose the most efficent more --what it can do as it knows sizeof-- grossly structs by ref, the rest by value. Is this reasoning correct?


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d mailing list