On Mon, 05 Mar 2012 20:34:09 -0500, Stewart Gordon <smjg_1...@yahoo.com> wrote:

On 05/03/2012 22:31, Steven Schveighoffer wrote:
On Mon, 05 Mar 2012 11:17:41 -0500, Stewart Gordon <smjg_1...@yahoo.com> wrote:

On 05/03/2012 13:49, Steven Schveighoffer wrote:
<snip>
It's currently transitive, and this would break transitivity. If we want to look at fundamentally redefining inout so that it can break transitivity, then we can look at that. But I don't think this is a simple "add-on" to the current functionality.
<snip>

Can you give an example of how it breaks transitivity?

Using the above foo function:

Which has only one level of indirection. So I can't see how transitivity comes into play.

void main()
{
void bar(int *x) {*x = 5;}
int i = 2;
foo(&i, &bar); // this sets i to 5 via the inout reference we pass into it.
}
<snip>

The foo function doesn't set i.  The bar function does.

The issue is that the bar function modifies i via the inout parameter to foo. That is, bar does not modify i directly, but modifies foo's parameter.


The design of inout is that the function with inout parameters doesn't know or care about the constancy of its arguments, _therefore_ cannot modify the data. The function that is passed in as a delegate, OTOH, _does_ know the constancy of its argument, and so _can_ modify it if the constancy permits. This is necessary to support foreach in the way we're talking about.

I think maybe transitivity is not the right term. It's just a straight const violation.

The thing I'm getting at is, there are two pieces to inout -- one is, it passes the constancy of the parameters back through the return value. The second is it acts as a surrogate for const in terms of API guarantees. That means, if I pass in a parameter as an inout parameter, it will not be modified during the function execution *through that parameter*.

Again, I want to stress that I think the idea is sound and could be implemented. But I think it fundamentally changes the way inout is conceptually designed.

-Steve

Reply via email to