Есть ли способ выбрать меньшее из двух воплощений? - PullRequest
0 голосов
/ 28 февраля 2019

Я имею в виду что-то вроде:

fn minimum<'a, 'b>(x: &'a mut i32, y: &'b mut i32) -> &'min(a, b) mut i32 {
    (x < y) ? x : y
}

Мы не знаем, какая ссылка будет выбрана при жизни, но компилятор знает, в какой области обе ссылки все еще действительны, и возвращенную ссылку можно безопасно использовать.

Обходной путь, который можно упомянуть:

fn minimum<'a, 'b> where 'b: 'a (x: &'a i32, y: 'b i32) -> &'a i32 {
    (x < y) ? x : y
}

на самом деле не является решением, потому что при вызове функции мы должны обрабатывать оба случая: когда 'a: 'b и 'b: 'a

1 Ответ

0 голосов
/ 28 февраля 2019

Это то, что компилятор делает автоматически , когда у вас есть единое время жизни:

fn minimum<'a>(x: &'a mut i32, y: &'a mut i32) -> &'a mut i32 {
    if x < y { x } else { y }
}

Это единственный безопасный параметр памяти, поскольку реализация функции может выбрать любую ссылку.

Не существует «максимального» эквивалента, поскольку его использование не гарантирует безопасность памяти.

См. Также:

...