Generic operator overloading for immutable types?

Gary Willoughby via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jun 13 12:29:26 PDT 2017


On Tuesday, 13 June 2017 at 11:36:45 UTC, Steven Schveighoffer 
wrote:
>
> Nope, const works just fine. A clue is in your return type -- 
> it's not inout!
>
> This should work:
>
> public Rational opBinary(string op)(Rational rhs) const
>
> If Rational had any indirections, then inout would be required, 
> and your signature wouldn't work (because you can't convert an 
> inout(SomethingWithPointers) to SomethingWithPointers).
>
> Why do I need to make the member function const, but not the 
> parameter? Because the parameter is taken by value, 'this' is a 
> reference.
>
> -Steve

Is it possible for the `result` variable in the following code to 
be returned as an immutable type if it's created by adding two 
immutable types?

import std.stdio;

struct Rational
{
	public long numerator;
	public long denominator;

	public inout Rational opBinary(string op)(inout(Rational) other) 
const
	{
		static if (op == "+")
		{
			return inout(Rational)(0, 0);
		}
		else
		{
			static assert(0, "Operator '" ~ op ~ "' not implemented");
		}
	}
}

unittest
{
	auto baz    = immutable(Rational)(1, 3);
	auto qux    = immutable(Rational)(1, 6);
	auto result = baz + qux;

	writeln(typeof(result).stringof); // Result is not immutable!
}



More information about the Digitalmars-d-learn mailing list