Rollup merge of #97397 - JohnTitor:stabilize-box-into-pin, r=Mark-Simulacrum
Stabilize `box_into_pin` FCP has been completed: https://github.com/rust-lang/rust/issues/62370#issuecomment-1012162279 Also, adds notes as per https://github.com/rust-lang/rust/issues/62370#issuecomment-1004108116 Closes #62370
This commit is contained in:
commit
9225f78b74
1 changed files with 21 additions and 2 deletions
|
@ -1175,14 +1175,33 @@ impl<T: ?Sized, A: Allocator> Box<T, A> {
|
||||||
/// This conversion does not allocate on the heap and happens in place.
|
/// This conversion does not allocate on the heap and happens in place.
|
||||||
///
|
///
|
||||||
/// This is also available via [`From`].
|
/// This is also available via [`From`].
|
||||||
#[unstable(feature = "box_into_pin", issue = "62370")]
|
///
|
||||||
|
/// # Notes
|
||||||
|
///
|
||||||
|
/// It's not recommended that crates add an impl like `From<Box<T>> for Pin<T>`,
|
||||||
|
/// as it'll introduce an ambiguity when calling `Pin::from`.
|
||||||
|
/// A demonstration of such a poor impl is shown below.
|
||||||
|
///
|
||||||
|
/// ```compile_fail
|
||||||
|
/// # use std::pin::Pin;
|
||||||
|
/// struct Foo; // A type defined in this crate.
|
||||||
|
/// impl From<Box<()>> for Pin<Foo> {
|
||||||
|
/// fn from(_: Box<()>) -> Pin<Foo> {
|
||||||
|
/// Pin::new(Foo)
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// let foo = Box::new(());
|
||||||
|
/// let bar = Pin::from(foo);
|
||||||
|
/// ```
|
||||||
|
#[stable(feature = "box_into_pin", since = "1.63.0")]
|
||||||
#[rustc_const_unstable(feature = "const_box", issue = "92521")]
|
#[rustc_const_unstable(feature = "const_box", issue = "92521")]
|
||||||
pub const fn into_pin(boxed: Self) -> Pin<Self>
|
pub const fn into_pin(boxed: Self) -> Pin<Self>
|
||||||
where
|
where
|
||||||
A: 'static,
|
A: 'static,
|
||||||
{
|
{
|
||||||
// It's not possible to move or replace the insides of a `Pin<Box<T>>`
|
// It's not possible to move or replace the insides of a `Pin<Box<T>>`
|
||||||
// when `T: !Unpin`, so it's safe to pin it directly without any
|
// when `T: !Unpin`, so it's safe to pin it directly without any
|
||||||
// additional requirements.
|
// additional requirements.
|
||||||
unsafe { Pin::new_unchecked(boxed) }
|
unsafe { Pin::new_unchecked(boxed) }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue