Explain more clearly why fn() -> T
can't be #[derive(Clone)]
This commit is contained in:
parent
092e4f46be
commit
c6566a8037
@ -86,6 +86,46 @@
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
|
/// If we `derive`:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #[derive(Copy, Clone)]
|
||||||
|
/// struct Generate<T>(fn() -> T);
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// the auto-derived implementations will have unnecessary `T: Copy` and `T: Clone` bounds:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # struct Generate<T>(fn() -> T);
|
||||||
|
///
|
||||||
|
/// // Automatically derived
|
||||||
|
/// impl<T: Copy> Copy for Generate<T> { }
|
||||||
|
///
|
||||||
|
/// // Automatically derived
|
||||||
|
/// impl<T: Clone> Clone for Generate<T> {
|
||||||
|
/// fn clone(&self) -> Generate<T> {
|
||||||
|
/// Generate(Clone::clone(&self.0))
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// The bounds are unnecessary because clearly the function itself should be
|
||||||
|
/// copy- and cloneable even if its return type is not:
|
||||||
|
///
|
||||||
|
/// ```compile_fail,E0599
|
||||||
|
/// #[derive(Copy, Clone)]
|
||||||
|
/// struct Generate<T>(fn() -> T);
|
||||||
|
///
|
||||||
|
/// struct NotCloneable;
|
||||||
|
///
|
||||||
|
/// fn generate_not_cloneable() -> NotCloneable {
|
||||||
|
/// NotCloneable
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// Generate(generate_not_cloneable).clone(); // error: trait bounds were not satisfied
|
||||||
|
/// // Note: With the manual implementations the above line will compile.
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
/// ## Additional implementors
|
/// ## Additional implementors
|
||||||
///
|
///
|
||||||
/// In addition to the [implementors listed below][impls],
|
/// In addition to the [implementors listed below][impls],
|
||||||
|
Loading…
Reference in New Issue
Block a user