www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - What's wrong in this templatized operator overload ?

reply MobPassenger <MobPassenger nowhere.fi> writes:
code:
---
struct Foo
{
     bool opIn_r(T)(T t){return false;}
}

static immutable Foo foo; // ouch
//static Foo foo; // OK

void main()
{
     assert("a" !in foo);
}
---

output:
---
Error: template Foo.opIn_r cannot deduce function from argument 
types !()(string) immutable, candidates are:
runnable.Foo.opIn_r(T)(T t)
---
Oct 21 2015
parent reply Mike Parker <aldacron gmail.com> writes:
On Thursday, 22 October 2015 at 03:19:49 UTC, MobPassenger wrote:
 code:
 ---
 struct Foo
 {
     bool opIn_r(T)(T t){return false;}
 }
This needs to be marked with const: struct Foo { bool opIn_r(T)(T t) const {return false;} }
Oct 21 2015
parent reply MobPassenger <MobPassenger nowhere.fi> writes:
On Thursday, 22 October 2015 at 04:01:16 UTC, Mike Parker wrote:
 On Thursday, 22 October 2015 at 03:19:49 UTC, MobPassenger 
 wrote:
 code:
 ---
 struct Foo
 {
     bool opIn_r(T)(T t){return false;}
 }
This needs to be marked with const: struct Foo { bool opIn_r(T)(T t) const {return false;} }
what's the rationale ? what's guaranteed by the qualifier that's not already true without const ?
Oct 21 2015
parent reply Cauterite <cauterite gmail.com> writes:
On Thursday, 22 October 2015 at 04:25:01 UTC, MobPassenger wrote:
 On Thursday, 22 October 2015 at 04:01:16 UTC, Mike Parker wrote:
 On Thursday, 22 October 2015 at 03:19:49 UTC, MobPassenger 
 wrote:
 code:
 ---
 struct Foo
 {
     bool opIn_r(T)(T t){return false;}
 }
This needs to be marked with const: struct Foo { bool opIn_r(T)(T t) const {return false;} }
what's the rationale ? what's guaranteed by the qualifier that's not already true without const ?
`const` just means the function won't mutate the object. `const` functions can be safely called on mutable, const and immutable objects. Non-`const` functions can only be called on mutable objects.
Oct 21 2015
parent MobPassenger <MobPassenger nowhere.fi> writes:
On Thursday, 22 October 2015 at 05:17:29 UTC, Cauterite wrote:
 On Thursday, 22 October 2015 at 04:25:01 UTC, MobPassenger 
 wrote:
 On Thursday, 22 October 2015 at 04:01:16 UTC, Mike Parker 
 wrote:
 On Thursday, 22 October 2015 at 03:19:49 UTC, MobPassenger 
 wrote:
 code:
 ---
 struct Foo
 {
     bool opIn_r(T)(T t){return false;}
 }
This needs to be marked with const: struct Foo { bool opIn_r(T)(T t) const {return false;} }
what's the rationale ? what's guaranteed by the qualifier that's not already true without const ?
`const` just means the function won't mutate the object. `const` functions can be safely called on mutable, const and immutable objects. Non-`const` functions can only be called on mutable objects.
Thx for the explanations. By the way I knew that when const is applied to the return type it has to be surrounded between parens but so far I've never encountered the other case...And now I also remember why this attribte should rather be put at the right of the function declaration.
Oct 22 2015