@@ -119,8 +119,8 @@ impl const Drop for Foo { fn drop(&mut self) {} } // not allowed
119
119
120
120
## Runtime uses don't have ` const ` restrictions
121
121
122
- ` impl const ` blocks additionally generate impls that are not const if any generic
123
- parameters are not const .
122
+ ` impl const ` blocks are treated as if the constness is a generic parameter
123
+ (see also effect systems in the alternatives) .
124
124
125
125
E.g.
126
126
@@ -134,7 +134,23 @@ impl<T: Add> const Add for Foo<T> {
134
134
135
135
allows calling ` Foo(String::from("foo")) + Foo(String::from("bar")) ` even though that is (at the time
136
136
of writing this RFC) most definitely not const, because ` String ` only has an ` impl Add for String `
137
- and not an ` impl const Add for String ` .
137
+ and not an ` impl const Add for String ` . Expressed in some sort of effect system syntax (neither
138
+ effect syntax nor effect semantics are proposed by this RFC, the following is just for demonstration
139
+ purposes):
140
+
141
+ ``` rust
142
+ impl <constness c , T : const (c ) Add > const (c ) Add for Foo <T > {
143
+ const (c ) fn add (self , other : Self ) -> Self {
144
+ Foo (self . 0 + other . 0 )
145
+ }
146
+ }
147
+ ```
148
+
149
+ In this scheme on can see that if the ` c ` parameter is set to ` const ` , the ` T ` parameter requires a
150
+ ` const Add ` bound, and creates a ` const Add ` impl for ` Foo<T> ` which then has a ` const fn add `
151
+ method. On the other hand, if ` c ` is ` ?const ` , we get a regular impl without any constness anywhere.
152
+ Of course for regular impls one can still pass a ` T ` which has a ` const Add ` impl, but that won't
153
+ cause any constness for ` Foo<T> ` .
138
154
139
155
This goes in hand with the current scheme for const functions, which may also be called
140
156
at runtime with runtime arguments, but are checked for soundness as if they were called in
@@ -147,6 +163,18 @@ const fn add<T: Add>(a: T, b: T) -> T {
147
163
}
148
164
```
149
165
166
+ Using the same effect syntax from above:
167
+
168
+ ``` rust
169
+ <constness c > const (c ) fn add <T : const (c ) Add >(a : T , b : T ) -> T {
170
+ a + b
171
+ }
172
+ ```
173
+
174
+ Here the value of ` c ` decides both whether the ` add ` function is ` const ` and whether its parameter
175
+ ` T ` has a ` const Add ` impl. Since both use the same ` constness ` variable, ` T ` is guaranteed to have
176
+ a ` const Add ` iff ` add ` is ` const ` .
177
+
150
178
This feature could have been added in the future in a backwards compatible manner, but without it
151
179
the use of ` const ` impls is very restricted for the generic types of the standard library due to
152
180
backwards compatibility.
0 commit comments