digitalmars.D - opMul
- Denton Cockburn (2/2) Mar 02 2008 Is there a reason why opMul cannot be called on a constant object?
-
Simen Kjaeraas
(32/35)
Mar 02 2008
On Sun, 02 Mar 2008 20:10:23 +0100, Denton Cockburn
... - Bill Baxter (3/38) Mar 02 2008 I can't keep up here. Is a trailing 'const' legal D syntax now?
- Simen Kjaeraas (41/71) Mar 03 2008 =
- Walter Bright (1/1) Mar 03 2008 Looks like a compiler bug. The trailing const should work.
- Bill Baxter (5/6) Mar 03 2008 No, not a bug. That seems to work fine.
- Simen Kjaeraas (4/10) Mar 04 2008 Bill, take a look at my code. The opMul with trailing const clearly
- Bill Baxter (6/21) Mar 04 2008 Ah, ok. My mistake. I don't usually look at the groups with threading
- Denton Cockburn (5/6) Mar 03 2008 So the trailing const will be kept?
- Janice Caron (2/3) Mar 04 2008 For member functions, yes.
- Denton Cockburn (10/54) Mar 02 2008 A function does not have to be constant to allow a constant parameter.
-
Simen Kjaeraas
(27/36)
Mar 03 2008
On Mon, 03 Mar 2008 04:10:36 +0100, Denton Cockburn
... - Denton Cockburn (25/65) Mar 03 2008 You are unfortunately completely missing my point.
- Bill Baxter (9/79) Mar 03 2008 Your question is contradictory. Above you say you want an error, but
- Denton Cockburn (33/46) Mar 03 2008 You're right, that was a mistake.
- Bill Baxter (9/64) Mar 03 2008 Ok *that's* because saying the parameter is const doesn't mean the
- Denton Cockburn (2/2) Mar 03 2008 Yep, that did the trick.
- Denton Cockburn (3/11) Mar 03 2008 I think that was said to be something that's going to be fixed (at some
- Bill Baxter (6/10) Mar 05 2008 and apparently const at the end means that too, now.
- Koroskin Denis (3/13) Mar 06 2008 This syntax looks less confusing to me. Why keep both?
- Janice Caron (44/45) Mar 06 2008 The syntax /is/ confusing. This is one of those "remaining const
- Dave (6/25) Mar 08 2008 Offhand, that sounds like a great solution to me...
- Janice Caron (24/26) Mar 08 2008 Simple answer: Walter either doesn't like it or has more important
- Simen Kjaeraas (7/34) Mar 08 2008 With trailing const being allowed, I see no problem with T const f(),
- Dave (6/47) Mar 08 2008 Actually, now that I see that:
- Dave (5/32) Mar 08 2008 I like that one also.
- Dave (9/11) Mar 08 2008 OTOH, "T f() const" is not only familiar to C++ programmers but it is no...
- Janice Caron (6/6) Mar 08 2008 As an aside, Walter has now given us the syntax
- Simen Kjaeraas (12/29) Mar 06 2008 I agree. With const foo x; meaning x is const, const foo y(){} meaning y...
- Janice Caron (3/5) Mar 06 2008 And of course, it doesn't. (Obviously, you knew that).
Is there a reason why opMul cannot be called on a constant object? This restriction is hardcoded (I clearly don't have a choice for my object).
Mar 02 2008
On Sun, 02 Mar 2008 20:10:23 +0100, Denton Cockburn <diboss hotmail.com>= = wrote:Is there a reason why opMul cannot be called on a constant object? This restriction is hardcoded (I clearly don't have a choice for my =object).That would be due to opMul not being defined as a const function. import std.stdio; struct Foo1 { int bar; = Foo1 opMul(int rhs) { bar *=3D rhs; return *this; } } struct Foo2 { int bar; = Foo2 opMul(int rhs) const // difference here { bar *=3D rhs; return *this; } } void main() { const Foo1 foo1 =3D Foo1(4); Foo1 bar1 =3D foo1 * 3; // fails const Foo2 foo2 =3D Foo2(4); Foo2 bar2 =3D foo2 * 3; // works }
Mar 02 2008
Simen Kjaeraas wrote:On Sun, 02 Mar 2008 20:10:23 +0100, Denton Cockburn <diboss hotmail.com> wrote:I can't keep up here. Is a trailing 'const' legal D syntax now? --bbIs there a reason why opMul cannot be called on a constant object? This restriction is hardcoded (I clearly don't have a choice for my object).That would be due to opMul not being defined as a const function. import std.stdio; struct Foo1 { int bar; Foo1 opMul(int rhs) { bar *= rhs; return *this; } } struct Foo2 { int bar; Foo2 opMul(int rhs) const // difference here { bar *= rhs; return *this; } }
Mar 02 2008
On Mon, 03 Mar 2008 02:01:09 +0100, Bill Baxter = <dnewsgroup billbaxter.com> wrote:Simen Kjaeraas wrote:On Sun, 02 Mar 2008 20:10:23 +0100, Denton Cockburn ==<diboss hotmail.com> wrote:Is there a reason why opMul cannot be called on a constant object? This restriction is hardcoded (I clearly don't have a choice for my =Well, in a way. After becoming sober, I re-read this today and... ouch. It seems to me that the trailing const says "this function is const, = really!" while in fact, it is not. Case in point: above code, which = obviously changes this.bar. Walter (or anyone else who understands const), is this how things are = supposed to be? correct code would be as follows: import std.stdio; struct Foo1 { int bar; = Foo1 opMul(int rhs) { Foo1 tmp; tmp.bar =3D bar * rhs; return tmp; } } struct Foo2 { int bar; = const Foo2 opMul(int rhs) // difference here { Foo2 tmp; tmp.bar =3D bar * rhs; return tmp; } } void main() { const Foo1 foo1 =3D Foo1(4); Foo1 bar1 =3D foo1 * 3; // fails const Foo2 foo2 =3D Foo2(4); Foo2 bar2 =3D foo2 * 3; // works } This correctly fails if this.bar is changed.I can't keep up here. Is a trailing 'const' legal D syntax now? --bbobject).That would be due to opMul not being defined as a const function. import std.stdio; struct Foo1 { int bar; Foo1 opMul(int rhs) { bar *=3D rhs; return *this; } } struct Foo2 { int bar; Foo2 opMul(int rhs) const // difference here { bar *=3D rhs; return *this; } }
Mar 03 2008
Looks like a compiler bug. The trailing const should work.
Mar 03 2008
Walter Bright wrote:Looks like a compiler bug. The trailing const should work.No, not a bug. That seems to work fine. What doesn't work is doing it *without* const either in front or at the end. And that's correct behavior. --bb
Mar 03 2008
On Tue, 04 Mar 2008 00:31:38 +0100, Bill Baxter <dnewsgroup billbaxter.com> wrote:Walter Bright wrote:Bill, take a look at my code. The opMul with trailing const clearly changes this.bar, thus it's a bug.Looks like a compiler bug. The trailing const should work.No, not a bug. That seems to work fine. What doesn't work is doing it *without* const either in front or at the end. And that's correct behavior. --bb
Mar 04 2008
Simen Kjaeraas wrote:On Tue, 04 Mar 2008 00:31:38 +0100, Bill Baxter <dnewsgroup billbaxter.com> wrote:Ah, ok. My mistake. I don't usually look at the groups with threading on because the threads just get too darn deep. And Walter's reply contained no context, so I thought he was responding to Denton's part of the thread about things compiling. --bbWalter Bright wrote:Bill, take a look at my code. The opMul with trailing const clearly changes this.bar, thus it's a bug.Looks like a compiler bug. The trailing const should work.No, not a bug. That seems to work fine. What doesn't work is doing it *without* const either in front or at the end. And that's correct behavior. --bb
Mar 04 2008
On Mon, 03 Mar 2008 14:47:56 -0800, Walter Bright wrote:Looks like a compiler bug. The trailing const should work.So the trailing const will be kept? Why have it both ways? (even though there are other things that can be specified in multiple ways) *joking* Not very pythonic... *joking*
Mar 03 2008
On 03/03/2008, Bill Baxter <dnewsgroup billbaxter.com> wrote:I can't keep up here. Is a trailing 'const' legal D syntax now?For member functions, yes.
Mar 04 2008
On Mon, 03 Mar 2008 01:47:33 +0100, Simen Kjaeraas wrote:On Sun, 02 Mar 2008 20:10:23 +0100, Denton Cockburn <diboss hotmail.com> wrote:A function does not have to be constant to allow a constant parameter. It just has to promise not to change the parameter. I don't understand why opMul would change the parameter, or more importantly, why it can't be stated that it WONT change the parameter in any cases. I think this is related to what Janice spoke about. The constant changes that have taken place need to be properly incorporated into the language and library. There are a lot of places where constant doesn't work as would be intuitively expected.Is there a reason why opMul cannot be called on a constant object? This restriction is hardcoded (I clearly don't have a choice for my object).That would be due to opMul not being defined as a const function. import std.stdio; struct Foo1 { int bar; Foo1 opMul(int rhs) { bar *= rhs; return *this; } } struct Foo2 { int bar; Foo2 opMul(int rhs) const // difference here { bar *= rhs; return *this; } } void main() { const Foo1 foo1 = Foo1(4); Foo1 bar1 = foo1 * 3; // fails const Foo2 foo2 = Foo2(4); Foo2 bar2 = foo2 * 3; // works }
Mar 02 2008
On Mon, 03 Mar 2008 04:10:36 +0100, Denton Cockburn <diboss hotmail.com>= = wrote:A function does not have to be constant to allow a constant parameter.=It just has to promise not to change the parameter.And that is exactly what const does.I don't understand why opMul would change the parameter, or more importantly, why it can't be stated that it WONT change the parameter =inany cases.Given struct Foo { int bar; void doStuff(Foo b) { bar +=3D b.bar; } } would you expect const Foo f,g; f.doStuff(g); to work without problems? This is exactly the same, only doStuff is not = = considered special by the compiler. You might argue that the compiler should enforce opMul, opDiv, etc. to b= e = const, but that does carry a load of other troubles with it.I think this is related to what Janice spoke about. The constant chan=gesthat have taken place need to be properly incorporated into the langua=geand library. There are a lot of places where constant doesn't work as=would be intuitively expected.This is intuitive to me. (Well, apart from what I mentioned in the = response to Bill :p)
Mar 03 2008
On Mon, 03 Mar 2008 15:08:55 +0100, Simen Kjaeraas wrote:On Mon, 03 Mar 2008 04:10:36 +0100, Denton Cockburn <diboss hotmail.com> wrote:You are unfortunately completely missing my point. In the example you give, you don't want a const parameter, because you change the object. I WANT a const parameter, because I have NO INTENTION of changing the parameter. so what I want is this: struct Foo { int bar; void doStuff(const Foo b) { bar += b.bar; /* I want an error here */ } /* now more specifically, I want to do the same as above...but with */ /* opMul */ Foo opMul(const Foo b) { Foo res; res.bar = bar * b.bar; return res; } } See, I make NO changes to the object in that opMul, so my question is...why is that illegal (intuitively)?A function does not have to be constant to allow a constant parameter. It just has to promise not to change the parameter.And that is exactly what const does.I don't understand why opMul would change the parameter, or more importantly, why it can't be stated that it WONT change the parameter in any cases.Given struct Foo { int bar; void doStuff(Foo b) { bar += b.bar; } } would you expect const Foo f,g; f.doStuff(g); to work without problems? This is exactly the same, only doStuff is not considered special by the compiler. You might argue that the compiler should enforce opMul, opDiv, etc. to be const, but that does carry a load of other troubles with it.I think this is related to what Janice spoke about. The constant changes that have taken place need to be properly incorporated into the language and library. There are a lot of places where constant doesn't work as would be intuitively expected.This is intuitive to me. (Well, apart from what I mentioned in the response to Bill :p)
Mar 03 2008
Denton Cockburn wrote:On Mon, 03 Mar 2008 15:08:55 +0100, Simen Kjaeraas wrote:You're not changing b, so you're not going to get an error there.On Mon, 03 Mar 2008 04:10:36 +0100, Denton Cockburn <diboss hotmail.com> wrote:You are unfortunately completely missing my point. In the example you give, you don't want a const parameter, because you change the object. I WANT a const parameter, because I have NO INTENTION of changing the parameter. so what I want is this: struct Foo { int bar; void doStuff(const Foo b) { bar += b.bar; /* I want an error here */ }A function does not have to be constant to allow a constant parameter. It just has to promise not to change the parameter.And that is exactly what const does.I don't understand why opMul would change the parameter, or more importantly, why it can't be stated that it WONT change the parameter in any cases.Given struct Foo { int bar; void doStuff(Foo b) { bar += b.bar; } } would you expect const Foo f,g; f.doStuff(g); to work without problems? This is exactly the same, only doStuff is not considered special by the compiler. You might argue that the compiler should enforce opMul, opDiv, etc. to be const, but that does carry a load of other troubles with it.I think this is related to what Janice spoke about. The constant changes that have taken place need to be properly incorporated into the language and library. There are a lot of places where constant doesn't work as would be intuitively expected.This is intuitive to me. (Well, apart from what I mentioned in the response to Bill :p)/* now more specifically, I want to do the same as above...but with */ /* opMul */ Foo opMul(const Foo b) { Foo res; res.bar = bar * b.bar; return res; } } See, I make NO changes to the object in that opMul, so my question is...why is that illegal (intuitively)?Your question is contradictory. Above you say you want an error, but then ask why is that illegal. It's not illegal. It works fine. Did you mean "why is it *legal*?" If you mean why is it *legal* to use a const parameter like that, the answer is because const only says you won't change the parameter. Merely accessing a value does not change it. --bb
Mar 03 2008
On Tue, 04 Mar 2008 05:56:57 +0900, Bill Baxter wrote:Denton Cockburn wrote:You're right, that was a mistake. I misphrased my whole query (I misread the compiler error message). The concern is still there though, here's a sample of code that produces the message. struct Foo { int x; Foo opMul(const Foo b) { Foo f; f.x = x * b.x; return f; } } void main() { Foo f; Foo y; f.x = 6; y.x = 7; const(Foo) t = f; Foo p = t * y; } produces this error: test.d(24): function test.Foo.opMul (const(Foo)) does not match parameter types (Foo) test.d(24): Error: t.opMul can only be called on a mutable object, not const(Foo) So my question SHOULD have been: Why can't opMul et al be called on a constant object (reference)? Sorry for the previous confusion.so what I want is this: struct Foo { int bar; void doStuff(const Foo b) { bar += b.bar; /* I want an error here */ }You're not changing b, so you're not going to get an error there.
Mar 03 2008
Denton Cockburn wrote:On Tue, 04 Mar 2008 05:56:57 +0900, Bill Baxter wrote:Ok *that's* because saying the parameter is const doesn't mean the 'this' pointer is const. To make the hidden 'this' parameter const too you need to use const Foo opMul(const Foo b) {...} That const out front may look like it's modifying the return value, but its not. That would be const(Foo) opMul(const Foo b) {...} --bbDenton Cockburn wrote:You're right, that was a mistake. I misphrased my whole query (I misread the compiler error message). The concern is still there though, here's a sample of code that produces the message. struct Foo { int x; Foo opMul(const Foo b) { Foo f; f.x = x * b.x; return f; } } void main() { Foo f; Foo y; f.x = 6; y.x = 7; const(Foo) t = f; Foo p = t * y; } produces this error: test.d(24): function test.Foo.opMul (const(Foo)) does not match parameter types (Foo) test.d(24): Error: t.opMul can only be called on a mutable object, not const(Foo) So my question SHOULD have been: Why can't opMul et al be called on a constant object (reference)? Sorry for the previous confusion.so what I want is this: struct Foo { int bar; void doStuff(const Foo b) { bar += b.bar; /* I want an error here */ }You're not changing b, so you're not going to get an error there.
Mar 03 2008
Yep, that did the trick. IIRC, the const in front means const(this)
Mar 03 2008
On Tue, 04 Mar 2008 08:33:00 +0900, Bill Baxter wrote:and apparently const at the end means that too, now. Foo opMul(const Foo b) const { // also ok ... } --bbI think that was said to be something that's going to be fixed (at some point).
Mar 03 2008
Denton Cockburn wrote:Yep, that did the trick. IIRC, the const in front means const(this)and apparently const at the end means that too, now. Foo opMul(const Foo [b]) const { // also ok ... } --bb
Mar 05 2008
On Thu, 06 Mar 2008 03:04:39 +0300, Bill Baxter <dnewsgroup billbaxter.com> wrote:Denton Cockburn wrote:This syntax looks less confusing to me. Why keep both?Yep, that did the trick. IIRC, the const in front means const(this)and apparently const at the end means that too, now. Foo opMul(const Foo [b]) const { // also ok ... } --bb
Mar 06 2008
On 06/03/2008, Koroskin Denis <2korden+dmd gmail.com> wrote:This syntax looks less confusing to me. Why keep both?The syntax /is/ confusing. This is one of those "remaining const niggles" that is going to keep resurfacing until we come up with something acceptable to all. For now, I can tell you that const-at-the-end is allowed (a) for the benefit of those used to C++ syntax, and (b) for the benefit of those who just don't like const-at-the-start. Const-at-the-start is allowed so that you can write stuff like: class A { const { A opAdd(A a) {...} A opSub(A a) {...} A opMul(A a) {...} A opDiv(A a) {...} } } etc. Basically, it saves a lot of typing. I know I'm repeating myself here, but I still think my previous suggestion of replacing "const" with "const(this)" and allowing it only at the front is still a good one. After all, how much extra typing, proportionately, is class A { const(this) { A opAdd(A a) {...} A opSub(A a) {...} A opMul(A a) {...} A opDiv(A a) {...} } } ? And for single functions const(this) T f() is a lot less confusing than const T f() as the former tells me explicitly that "this" is the thing that is const, wheras the latter makes it look like "T" is const (which it isn't). If this is not changed, then years, even decades from now, people will still be complaining that it's confusing, and while it is true that you can get used to it, I still think it's better not to confuse in the first place.
Mar 06 2008
"Janice Caron" <caron800 googlemail.com> wrote in message news:mailman.113.1204800234.2351.digitalmars-d puremagic.com...On 06/03/2008, Koroskin Denis <2korden+dmd gmail.com> wrote:Offhand, that sounds like a great solution to me... Janice, why has it been "shot down" in the past? Thanks, - DaveThis syntax looks less confusing to me. Why keep both?class A { const(this) { A opAdd(A a) {...} A opSub(A a) {...} A opMul(A a) {...} A opDiv(A a) {...} } } ? And for single functions const(this) T f() is a lot less confusing than const T f() as the former tells me explicitly that "this" is the thing that is const, wheras the latter makes it look like "T" is const (which it isn't).
Mar 08 2008
On 08/03/2008, Dave <Dave_member pathlink.com> wrote:Janice, why has it been "shot down" in the past? Thanks,Simple answer: Walter either doesn't like it or has more important things to work on. In fairness, this isn't the /only/ idea which has been suggested, and I think some people did complain about the extra typing it would need. Another suggestion was T const f() (the idea being that const applies to whatever is immediately to its right). I do kinda like that one too, but Walter shot that one down, primarily I think because it means you can't group multiple functions together under a single "const" attribute. The "const(this)" idea doesn't suffer from that disadvantage, but it does mean more typing, and I think that so long as "the ranks are split", so to speak, then there's no compelling reason for Walter to move to any particular choice of solution. ...indeed, I don't think he even acknowledges that there's a problem. I recall Walter saying that people will just get used to it (that's from memory, not an exact quote - I apologise if I got that wrong), in much the same way that we've got used to C++'s const syntax being inconsistent. Personally, I like "const(this)", despite the extra typing, because it opens the door for future expansion (e.g "const(outer)" meaning "this function will not modify outer"). Dunno if that answers the question or not. Probably not, but I tried.
Mar 08 2008
On Sat, 08 Mar 2008 20:00:37 +0100, Janice Caron <caron800 googlemail.com> wrote:On 08/03/2008, Dave <Dave_member pathlink.com> wrote:With trailing const being allowed, I see no problem with T const f(), and I think it is the most obvious way to write it. For preceding 'const', one logical step would be to allow only const: and const(X): to be placed in front of functions, and disallow const T f(). -- SimenJanice, why has it been "shot down" in the past? Thanks,Simple answer: Walter either doesn't like it or has more important things to work on. In fairness, this isn't the /only/ idea which has been suggested, and I think some people did complain about the extra typing it would need. Another suggestion was T const f() (the idea being that const applies to whatever is immediately to its right). I do kinda like that one too, but Walter shot that one down, primarily I think because it means you can't group multiple functions together under a single "const" attribute. The "const(this)" idea doesn't suffer from that disadvantage, but it does mean more typing, and I think that so long as "the ranks are split", so to speak, then there's no compelling reason for Walter to move to any particular choice of solution. ...indeed, I don't think he even acknowledges that there's a problem. I recall Walter saying that people will just get used to it (that's from memory, not an exact quote - I apologise if I got that wrong), in much the same way that we've got used to C++'s const syntax being inconsistent. Personally, I like "const(this)", despite the extra typing, because it opens the door for future expansion (e.g "const(outer)" meaning "this function will not modify outer"). Dunno if that answers the question or not. Probably not, but I tried.
Mar 08 2008
"Simen Kjaeraas" <simen.kjaras gmail.com> wrote in message news:op.t7pz1mgy1hx7vj spill04.lan...On Sat, 08 Mar 2008 20:00:37 +0100, Janice Caron <caron800 googlemail.com> wrote:Actually, now that I see that: const T function_without_this(){} is not allowed, I think the current idiom is acceptable because it's consistent.On 08/03/2008, Dave <Dave_member pathlink.com> wrote:With trailing const being allowed, I see no problem with T const f(), and I think it is the most obvious way to write it. For preceding 'const', one logical step would be to allow only const: and const(X): to be placed in front of functions, and disallow const T f(). -- SimenJanice, why has it been "shot down" in the past? Thanks,Simple answer: Walter either doesn't like it or has more important things to work on. In fairness, this isn't the /only/ idea which has been suggested, and I think some people did complain about the extra typing it would need. Another suggestion was T const f() (the idea being that const applies to whatever is immediately to its right). I do kinda like that one too, but Walter shot that one down, primarily I think because it means you can't group multiple functions together under a single "const" attribute. The "const(this)" idea doesn't suffer from that disadvantage, but it does mean more typing, and I think that so long as "the ranks are split", so to speak, then there's no compelling reason for Walter to move to any particular choice of solution. ...indeed, I don't think he even acknowledges that there's a problem. I recall Walter saying that people will just get used to it (that's from memory, not an exact quote - I apologise if I got that wrong), in much the same way that we've got used to C++'s const syntax being inconsistent. Personally, I like "const(this)", despite the extra typing, because it opens the door for future expansion (e.g "const(outer)" meaning "this function will not modify outer"). Dunno if that answers the question or not. Probably not, but I tried.
Mar 08 2008
"Janice Caron" <caron800 googlemail.com> wrote in message news:mailman.134.1205002850.2351.digitalmars-d puremagic.com...On 08/03/2008, Dave <Dave_member pathlink.com> wrote:I like that one also.Janice, why has it been "shot down" in the past? Thanks,Simple answer: Walter either doesn't like it or has more important things to work on. In fairness, this isn't the /only/ idea which has been suggested, and I think some people did complain about the extra typing it would need. Another suggestion was T const f()(the idea being that const applies to whatever is immediately to its right). I do kinda like that one too, but Walter shot that one down, primarily I think because it means you can't group multiple functions together under a single "const" attribute. The "const(this)" idea doesn't suffer from that disadvantage, but it does mean more typing, and I think that so long as "the ranks are split", so to speak, then there's no compelling reason for Walter to move to any particular choice of solution. ...indeed, I don't think he even acknowledges that there's a problem. I recall Walter saying that people will just get used to it (that's from memory, not an exact quote - I apologise if I got that wrong), in much the same way that we've got used to C++'s const syntax being inconsistent. Personally, I like "const(this)", despite the extra typing, because it opens the door for future expansion (e.g "const(outer)" meaning "this function will not modify outer"). Dunno if that answers the question or not. Probably not, but I tried.Yes, that answers it - thanks. I think either const(this) or T const f() are prefereable to trailing const.
Mar 08 2008
"Dave" <Dave_member pathlink.com> wrote in message news:fqv8qj$1ol3$1 digitalmars.com...I think either const(this) or T const f() are prefereable to trailing const.OTOH, "T f() const" is not only familiar to C++ programmers but it is now consistent with another function modifier, 'nothrow'. And since it would then allow for: const T function_without_this(){} it would be yet more consistent with how const is used elsewhere with types. Walter, is this why you added trailing const? - Dave
Mar 08 2008
As an aside, Walter has now given us the syntax this(this) { ... } for post-processing of structs after a bitwise copy. That's completely unrelated, of course, but it struck me as interesting that there is now a precedent for "this in brackets", even though in a different context.
Mar 08 2008
On Thu, 06 Mar 2008 11:29:33 +0100, Koroskin Denis <2korden+dmd gmail.com> wrote:On Thu, 06 Mar 2008 03:04:39 +0300, Bill Baxter <dnewsgroup billbaxter.com> wrote:I agree. With const foo x; meaning x is const, const foo y(){} meaning y is const... wait, this actually does seem to make sense when you look at it like that. Better way to think of it: const foo x; is the same as const(foo) x;. Thus, const foo y(){}; should also mean const(foo) y(){};. Going with how D const should apply to whatever is directly after it, foo const y(){}; appears to me the most logical way of writing it. Trailing const is also acceptable to me, seeing as there's nothing else that const could refer to. -- SimenDenton Cockburn wrote:This syntax looks less confusing to me. Why keep both?Yep, that did the trick. IIRC, the const in front means const(this)and apparently const at the end means that too, now. Foo opMul(const Foo [b]) const { // also ok ... } --bb
Mar 06 2008
On 06/03/2008, Simen Kjaeraas <simen.kjaras gmail.com> wrote:const foo x; is the same as const(foo) x;. Thus, const foo y(){}; should also mean const(foo) y(){};.And of course, it doesn't. (Obviously, you knew that). But that's the problem, I agree.
Mar 06 2008