The protection is that you cant do ```f1 |= ~f2```, which is quite good to prevent.
The code can be used outside the module since you do not need to actually use the Negation type.
As of this moment it seems like access control for private structs nested in templates is not enforced, but you can see that it works even with top level structs:
```
module a;
private struct Private
{
    int value;
}
struct Public
{
    int value;
    Private toPrivate()
    {
        Private p = {value};
        return p;
    }
    void fromPrivate(Private p)
    {
        value = p.value;
    }
}

module b;
unittest
{
	Public a = {10};
	Public b;
	b.fromPrivate(a.toPrivate());
	assert(b == a);
}
```