What guarantees does D 'const' provide, compared to C++?
Chris Cain
clcain at uncg.edu
Thu Aug 16 20:36:27 PDT 2012
Well, since I'm not describing how const works anymore (although,
it's still different than C++ due to the mutable keyword in C++,
but I digress), I'll go ahead and jump in for this one...
On Friday, 17 August 2012 at 02:30:45 UTC, Mehrdad wrote:
> So unless you're expecting the compiler to have the
> implementation for the entire class available in order for it
> to be able to do any kind of optimization (in which case, it
> would have to do a whole bunch of inference to figure out the
> aliasing issues, which would amount to what a C++ could try do
> just as well), I'm not seeing where the additional
> guarantees/potential optimizations are.
I'll tackle the guarantees part and what the compiler could do.
Combine const and pure and here you go:
int global;
struct MyStruct {
int* y;
//this() { } // Stop doing this, it doesn't compile. :P
this(int* z) { y = z; }
auto getValue() const pure {
//++global; // error: cannot access mutable static data
'global'
return this.y;
}
void impureThing() const {
++global;
}
}
void func(ref const(MyStruct) s) pure {
//... can only call pure functions
// s.impureThing(); // error
}
import std.stdio;
void main() {
auto s = MyStruct(&global);
writeln(*s.getValue());
func(s); // func is pure and s will be const ... thus,
writeln(*s.getValue()); // guaranteed to be the same as first
call
}
And this is different than C++. If C++ did have a "pure" keyword
and it worked the same as D's pure keyword, then you still
couldn't make the same inference all the time because C++ allows
const things to internally mutate due to the mutable keyword.
Yeah, you have to start combining features to get the most out of
it, but const + pure allows for more optimizations/reasoning than
const or pure alone.
More information about the Digitalmars-d
mailing list