fn helper<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T { v }
/// Turn any `&T` into a `&'static T`. May introduce undefined behavior.
pub fn make_static<'a, T>(input: &'a T) -> &'static T {
let f: fn(_, &'a T) -> &'static T = helper;
f(&&(), input)
}
(
отсюдаНе ожидал, что так просто. Безо всякого unsafe берем и превращаем "одолженную"
(
Read more... )
Comments 5
Reply
И какого фига для этого нужно использовать промежуточную функцию?
Можно для не знатоков раста рассказать?
И кстати, что это за колдунский тип первого аргумента хелпера?
Reply
Подробности здесь:
https://github.com/rust-lang/rust/issues/25860
Reply
Это дефект компилятора - забыл наложить ограничение на шаблон функции, а должно было быть что-то типа
fn helper<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T
где 'a не может быть небезопаснее, чем 'b
{ v }
и дальше пошёл применять небезопасную функцию как попало?
Или это дефект стандарта, который не требует ни от компилятора неявно, ни от программиста явно накладывать такие ограничения?
Reply
Reply
Leave a comment