Подтвердить что ты не робот

Что означает знак вопроса в параметре типа?

Я нашел определение std::borrow::BorrowMut:

pub trait BorrowMut<Borrowed>: Borrow<Borrowed>
where
    Borrowed: ?Sized,
{
    fn borrow_mut(&mut self) -> &mut Borrowed;
}

Что означает знак вопроса перед Sized в этом параметре связанного параметра (Borrowed: ?Sized)?

Я консультировался:

но не нашел объяснения. Пожалуйста, дайте ссылку в своем ответе.


¹ особенно см. раздел 5.20 Черты
² и раздел 6.1.9 Черты
4b9b3361

Ответ 1

Это означает, что этот признак является необязательным. Текущий синтаксис был введен в синтаксис DST RFC.

Единственная черта, о которой я знаю, работает для ?: Sized.

В этом конкретном примере мы можем реализовать BorrowMut для нестандартных типов, например [T] - отметить, что здесь нет &!

Одна встроенная реализация использует это:

impl<T> BorrowMut<[T]> for Vec<T>

Как Маттиу М. добавляет:

Это случай расширяющейся границы; в общих границах налагают больше ограничений, но в случае Sized было решено, что если не указано иначе, общий T будет считаться Sized. Способ заметить наоборот - отметить его ?Sized ( "возможно, Sized" ).