Rust: рдЕрдирдЯреИрдЧреНрдб рдпреВрдирд┐рдпрди (RFC 1444 рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  210рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛-рд▓рдВрдЧ / rfcs # 1444ред

рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди:

  • [x] рдХреНрдпрд╛ рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реАрдзреЗ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдкрд┐рдЫрд▓реА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреА рдПрдХ рдмреВрдВрдж рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ?
  • [x] рд╕рдВрдШ рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╕рдордп, рдХреНрдпрд╛ рдЕрдиреНрдп рдХреЛ рдЕрдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ? ( 1 , 2 , 3 , 4 )
  • [] рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЖрдк рд╕рдВрдШ рдХреЗ рд▓рд┐рдП Copy рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреБрдЫ рд╡реЗрд░рд┐рдПрдВрдЯ рдиреЙрди-рдХреЙрдкреА рдЯрд╛рдЗрдк рдХреЗ рд╣реЛрдВ? рд╕рднреА рдкреНрд░рдХрд╛рд░?
  • [] рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ рдПрдирдо рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рдмрд╛рддрдЪреАрдд рд╣реИ? (Https://github.com/rust-lang/rust/issues/36394)

рдЙрдЪреНрдЪ рдЖрдпрд╛рдд рдХреЗ рдЦреБрд▓реЗ рдореБрджреНрджреЗ:

  • [x] https://github.com/rust-lang/rust/issues/47412 - MIR- рдЖрдзрд╛рд░рд┐рдд рдмреЗрд╡рдЬрд╣ рдЪреЗрдХрд░ рдХрднреА-рдХрднреА рдирд┐рд░реНрдЬрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрдШ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ
B-RFC-approved B-unstable C-tracking-issue F-untagged_unions T-lang disposition-merge finished-final-comment-period

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@nrc
рдареАрдХ рд╣реИ, рдЙрдкрд╕рдореБрдЪреНрдЪрдп рд╕реНрдкрд╖реНрдЯ рд╣реИ - "рдПрдлрдПрдлрдЖрдИ рдпреВрдирд┐рдпрдиреНрд╕", рдпрд╛ "рд╕реА рдпреВрдирд┐рдпрдиреНрд╕", рдпрд╛ "рдкреНрд░реА-рд╕реА ++ 11 рдпреВрдирд┐рдпрдиреНрд╕" - рднрд▓реЗ рд╣реА рдпрд╣ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИред рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓рдХреНрд╖реНрдп рдЗрд╕ рд╕рдмрд╕реЗрдЯ ASAP (рдпрд╣ рдЪрдХреНрд░, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ) рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ winapi рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╢реЗрд╖ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрджрд┐рдЧреНрдз рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдФрд░ "рдпреВрдирд┐рдпрдВрд╕ 1.2" рдЖрд░рдПрдлрд╕реА рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╛рд╢рд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╢реЗрд╖ рднрд╛рдЧреЛрдВ рдХреЛ 1, 2 рдпрд╛ 3 рдЪрдХреНрд░реЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рднреА 210 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЗрд╕реЗ RFC рдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдореЗрдВ рд╕рд╣реА рд╣реВрдВ рдХрд┐ рдпреВрдирд┐рдпрди рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрднреА рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВ? рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ Box::new(1) рд▓рд┐рдП рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реЛрдЧрд╛?

union Foo {
    f: i32,
    g: Box<i32>,
}

let mut f = Foo { g: Box::new(1) };
f.g = Box::new(2);

@sfackler рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ f.g = Box::new(2) _will_ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди f = Foo { g: Box::new(2) } _not_ред рдпрд╣реА рд╣реИ, Box<i32> lvalue рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдПрдХ рдмреВрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди Foo lvalue рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рддреЛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдПрдХ рдЬреЛрд░ рдХреА рддрд░рд╣ рд╣реИ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдкрд╣рд▓реЗ "рд╡реИрдз" рдерд╛?

@sfackler Drop рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рд╛рдБ, рдпрд╣ рдореЗрд░реА рд╕рдордЭ рд╣реИред рдпрджрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╡реИрдз рдирд╣реАрдВ рдереЗ, рддреЛ рдЖрдкрдХреЛ Foo рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлреЙрд░реНрдо рдпрд╛ ptr::write ред рдПрдХ рддреНрд╡рд░рд┐рдд grep рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ RFC рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ Drop lvalue рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЙрд▓ рд╣реЛрддрд╛ рд╣реИред

рдбреНрд░реЙрдк рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдореНрдпреВрдЯ рдпреВрдирд┐рдпрди рдХреЛ рдПрдХ рд▓рд┐рдВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╢реБрдХреНрд░рд╡рд╛рд░, 8 рдЕрдкреНрд░реИрд▓ 2016 рдХреЛ, рд╕реНрдХреЙрдЯ рдУрд▓реНрд╕рди рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@sfackler https://github.com/sfackler рдбреНрд░реЙрдк рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рд╛рдБ, рдпрд╣ рдореЗрд░реА рд╣реИ
рд╕рдордЭред рдпрджрд┐ рд╡реЗ рдкрд╣рд▓реЗ рдорд╛рдиреНрдп рдирд╣реАрдВ рдереЗ, рддреЛ рдЖрдкрдХреЛ рдлреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлреЙрд░реНрдо рдпрд╛ ptr :: рд▓рд┐рдЦрдирд╛ред рдПрдХ рддреНрд╡рд░рд┐рдд grep рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ
RFC рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32836#issuecomment -207634431

8 рдЕрдкреНрд░реИрд▓ 2016 рдХреЛ 3:36:22 PM PDT, рд╕реНрдХреЙрдЯ рдУрд▓реНрд╕рди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@sfackler Drop рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рд╛рдБ, рдпрд╣ рдореЗрд░реА рд╕рдордЭ рд╣реИред рдпрджрд┐ рд╡реЗ
рдкрд╣рд▓реЗ рдорд╛рдиреНрдп рдирд╣реАрдВ рдереЗ рдЖрдкрдХреЛ Foo рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛
ptr::write ред рдПрдХ рддреНрд╡рд░рд┐рдд grep рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ RFC рд╣реИ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдореБрдЭреЗ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╡рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рд░рдХреНрд╖рд╛рддреНрдордХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХрднреА рднреА рдЧрд┐рд░рд╛рдирд╛ рдХрднреА рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред RFC рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрди рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдЯ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдорд╛рдиреНрдп рдерд╛ред

рд╣рд╛рдБ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдХрдо рдЦрддрд░рдирд╛рдХ рд▓рдЧрддрд╛ рд╣реИред

рдпреВрдирд┐рдпрди рдлреАрд▓реНрдб рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдкрд░ рдбреНрд░реЙрдкрд┐рдВрдЧ f.g = Box::new(2) let p = &mut f.g; *p = Box::new(2) рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдмрд╛рдж рдХреЗ рдХреЗрд╕ _not_ рдбреНрд░реЙрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИред

рдпрд╣ рдХреЛрдИ рдирдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ; unsafe рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ foo = bar UB рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ foo uninitialized рдФрд░ Drop ред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдбреНрд░реЙрдк рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛рдКрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдЕрдиреБрд░реВрдк рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рднреА рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рдбреНрд░реЙрдк рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдпрд╣ рд╕реБрд╕рдВрдЧрдд рд╣реИ, рддрдм рддрдХ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ рд╢рд╛рдпрдж рдХреЗ рд▓рд┐рдП рдкрд░рд╕реНрдкрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддрд╛
рдЗрдВрдЯреВ рдХреЗ рд╕рд╛рде рдмрд╕ "рдЕрдЬреАрдм-рдЯреИрдЧ" рд╡рд╛рд▓реЗ

рд╢реБрдХреНрд░рд╡рд╛рд░, 8 рдЕрдкреНрд░реИрд▓ 2016 рдХреЛ, рдкреАрдЯрд░ рдПрдЯрд╢рд┐рдпрд╛рди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рднреА рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рдбреНрд░реЙрдк рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ
рдЬрдм рддрдХ рдпрд╣ рд╕реБрд╕рдВрдЧрдд рд╣реИ рдореЗрд░реЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32836#issuecomment -207653168

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдирд╕реБрд▓рдЭреЗ рд╕рд╡рд╛рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореБрджреНрджрд╛ рд╣реИред рдореБрдЭреЗ рдЕрднреА рддрдХ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреМрди рд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИред

@nikomatsakis рдЬрд┐рддрдирд╛ рдореБрдЭреЗ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреНрд░реЙрдк рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рдкрд┐рдЫрд▓реА рд╡реИрдзрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдорд╛рдорд▓реЗ @tsion рд▓рдЧрднрдЧ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХреЛрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдПрдХ рд╕рдВрдШ рдореЗрдВ рдбреНрд░реЙрдк рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред (рдФрд░ рдЗрд╕рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдЙрд╕ рд▓рд┐рдВрдЯ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдкрд╛рда рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред)

рдФрд░ рдореИрдВ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ unsafe рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ a = b рдорддрд▓рдм drop_in_place(&mut a); ptr::write(&mut a, b) рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдирд╣реАрдВ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ __ рдЕрдзрд┐рдХ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛_ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж, рдХрдо рдирд╣реАрдВред

(рдПрдирдмреА: рдбреНрд░реЙрдк рддрдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм a _statically_ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ let a; a = b; ред)

рд▓реЗрдХрд┐рди рдореИрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ Drop рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ #[allow(..)] рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХрд╛рдлреА рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рд╣реИред

@ рд╕рд┐рдЯрд┐рдпрди рдпрд╣ a = b рд▓рд┐рдП рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдХрднреА-рдХрднреА a.x = b рд▓рд┐рдП рднреА рд╕рд╣реА рд╣реИ рд▓реЗрдХрд┐рди *a = b рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИред рдЗрд╕ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдиреЗ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рдХрд░ рджрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдВрдХрд▓рди:

fn main() {
  let mut x: (i32, i32);
  x.0 = 2;
  x.1 = 3;
}

(рд╣рд╛рд▓рд╛рдВрдХрд┐ x рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдмрд╛рдж рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдЧ)

@nikomatsakis рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рд▓рд┐рдП рдирдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдмрдЧ рдорд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ, рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдореИрдВрдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ рд╡рд╣ a = b рд▓рд┐рдП рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдХрднреА-рдХрднреА a.x = b ?

рдХрд╣реЛ, рдпрджрд┐ x.0 рдореЗрдВ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

fn main() {
    let mut x: (Box<i32>, i32);
    x.0 = Box::new(2); // x.0 statically know to be uninit, destructor not called
    x.0 = Box::new(3); // x.0 destructor is called before writing new value
}

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реЗрдЦрди рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрдХреЗрдд?

рдореЗрд░рд╛ рдХрд╣рдирд╛ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ = _always_ рдХреЛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ; рдпрд╣
рдХреБрдЫ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ
рдкреНрд░рд╛рд░рдВрднред

Tue, рдЕрдкреНрд░реИрд▓ 12, 2016 рдХреЛ 04:10:39 рдЕрдкрд░рд╛рд╣реНрди -0700 рдкрд░, рд╕реНрдХреЙрдЯ рдУрд▓реНрд╕рди рдиреЗ рд▓рд┐рдЦрд╛:

@nikomatsakis рдореЗрд░реЗ рд▓рд┐рдП рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдмрдЧ рдорд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ, рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдореИрдВрдиреЗ a = b рдФрд░ рдХреЗрд╡рд▓ рдХрднреА-рдХрднреА 'ax = b' рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд╣рд╛?

рдХрд╣реЛ, рдпрджрд┐ x.0 рдореЗрдВ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

fn main() {
    let mut x: (Box<i32>, i32);
    x.0 = Box::new(2); // x.0 statically know to be uninit, destructor not called
    x.0 = Box::new(3); // x.0 destructor is called
}

@nikomatsakis

рдпрд╣ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЪрд▓рд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рдбреНрд░реЙрдк рдлреНрд▓реИрдЧ рд╕реЗрдЯ рд╣реИред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд▓реЗрдЦрди рд╡реИрд╕реЗ рднреА рднреНрд░рд╛рдордХ рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл рдЗрд╕реЗ рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдЖрдк рд╣рдореЗрд╢рд╛ *(&mut u.var) = val ред

рдореЗрд░рд╛ рдХрд╣рдирд╛ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ = _always_ рдХреЛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ; рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓рдХреНрд╖реНрдп рдХреЛ рдЖрд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

@nikomatsakis рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐:

(рдПрдирдмреА: рдбреНрд░реЙрдк рддрдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдирдзрд┐рдХреГрдд рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ a; a = bред;)

рд▓реЗрдХрд┐рди рдореИрдВ рдбреНрд░реЙрдк рдЭрдВрдбреЗ рдХреА рдЧрддрд┐рд╢реАрд▓ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред

@tsion

рдбреНрд░реЙрдк рдлрд╝реНрд▓реИрдЧ рдХреЗрд╡рд▓ рдЕрд░реНрдз-рдЧрддрд┐рд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВ - рд╢реВрдиреНрдп рдбреНрд░реЙрдк рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реЗ рдХреЛрдбрдЧреЗрди рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЙрд╕ рддрд░рд╣ рдХреЗ рд▓реЗрдЦрди рдХреЛ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреЗ рд╕реЗ рдЕрдзрд┐рдХ рднреНрд░рдо рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ Drop рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП? рдЕрдЧрд░ рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ Rust рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╣реЛрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг C рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпреВрдирд┐рдпрдиреНрд╕ рд╣реИрдВ, рдФрд░ C рдХреЗ рдкрд╛рд╕ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рднреА рдирд╣реАрдВ рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ enum рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

NoDrop рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдШ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдбреНрд░реЙрдк рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА drop_in_place рдпрд╛ рд╕рдорд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕реЗ рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред

рдореЗрд░реЗ рд▓рд┐рдП рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдорд╛рди рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЫреЛрдбрд╝рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рдХреНрдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдкреВрд░реНрдг рд╕рдВрдШ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрджрд┐ рдпреВрдирд┐рдпрди рдкреВрд░реНрдгрд░реВрдкреЗрдг рдЧрд┐рд░рд╛ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдХреЗ рдмрджрд▓реЗ рдкреВрд░реНрдг рд╕рдВрдШ рдбреНрд░реЙрдк рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ; рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдбреНрд░реЙрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдлрд╝реАрд▓реНрдб рд╕рдВрднрд╡рддрдГ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдЬреЛ рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЧрд▓рддреА рд╕реЗ рд╣рд┐рдЯ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред

рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд╕реНрдкрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реВрдВ _ рдФрд░_ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдбрд╛рд▓рддреЗ рд╣реИрдВ (рд╕рдВрднрд╡рддрдГ Drop ) рдЙрдирдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВ рдХрд╕реНрдЯрдо рд╕реНрдкреЗрд╕-рдХреБрд╢рд▓ рдПрдирдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

union SlotInner<V> {
    next_empty: usize, /* index of next empty slot */
    value: V,
}

struct Slot<V> {
    inner: SlotInner<V>,
    version: u64 /* even version -> is_empty */
}

@nikomatsakis рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣рд╛рдВ рдЕрдирд╕реБрд▓рдЭреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рд╢реНрди рдХрд╛ рдПрдХ рдареЛрд╕ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЫреЛрдбрд╝рдирд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рд╕реЗ рдмрдЪрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реЗ рд╕рдВрдШ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ред рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдиреЗ рдкрд░ рдЬреЛ Drop рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдкрд╛рда рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП RFC1444 рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдХреЗ RFC рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реЛрдЧрд╛?

@joshtriplett рдЪреВрдБрдХрд┐ @nikomatsakis рдЫреБрдЯреНрдЯреА рдкрд░ рд╣реИ, рдореИрдВ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╢реЛрдзрди RFC рджрд╛рдпрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рдо рдЙрдкрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рдЕрдХреНрд╕рд░ рдРрд╕реЗ RFC PRs рдХреЛ рдлрд╛рд╕реНрдЯ рдЯреНрд░реИрдХ рдХрд░реЗрдВрдЧреЗред

@ рдиреНрдпреВрдЯрди рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдирдпрд╛ RFC PR https://github.com/rust-lang/rfcs/issues/1663 рдЗрди рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рджрд╛рдпрд░ рдХрд┐рдпрд╛ рд╣реИред RFC1444 рдореЗрдВ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

( @ рдиреНрдпреВрдЯрди рдЖрдк рдЕрдм рдЙрд╕ рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди рдХреЛ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред)

рдореЗрд░рд╛ https://github.com/petrochenkov/rust/tree/union рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ

рд╕реНрдерд┐рддрд┐: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд (modulo рдмрдЧ), PR рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ (https://github.com/rust-lang/rust/pull/p107107)ред

@petrochenkov рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрдм рддрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЪрд╛рд▓рди рдкрд░реАрдХреНрд╖рдХ рдореЗрдВ рдЧреИрд░ Copy рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ u union U { a: A, b: B } рдХрд╛ рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╣реИ рдФрд░ рдЕрдм рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВ:

1) A: !Copy, B: !Copy, move_out_of(u.a)
рдпрд╣ рд╕рд░рд▓ рд╣реИ, u.b рдХреЛ рднреА рдЕрд╕рдорд╛рди рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Sanity check: union U { a: T, b: T } рдХреЛ рдмрд┐рд▓рдХреБрд▓ struct S { a: T } + рдлрд╝реАрд▓реНрдб рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

2) A: Copy, B: !Copy, move_out_of(u.a)
рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ u.b рдХреЛ рдЕрднреА рднреА рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ move_out_of(u.a) рдХреЗрд╡рд▓ memcpy рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ u.b рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

2) A: !Copy, B: Copy, move_out_of(u.a)
рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЬреАрдм рдорд╛рдорд▓рд╛ рд╣реИ; рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ u.b рдХреЛ Copy рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рднреА рдЕрд╕рдорд╛рди рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Copy рдорд╛рдиреЛрдВ рдХрд╛ рдЕрдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ let a: u8; ), рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗ рдмрджрд▓рдХрд░ рдПрдХрддрд░рдлрд╛ рдмрдирд╛рдирд╛ рдХреБрдЫ рдирдпрд╛ рд╣реИ, AFAIKред

@ retep998
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдлрдПрдлрдЖрдИ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ :)
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд╡рд░реЛрдзрдХ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЬреЛ рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд░рд▓ рд╣реИ рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреАрдЖрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реВрдВрдЧрд╛ред

@petrochenkov рдореЗрд░реА рд╡реГрддреНрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдПрдХ "рдмрд┐рдЯ-рдмрдХреЗрдЯ" рд╣реИрдВ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗред рдЖрдк рдпрд╣ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдпрд╣ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рдорд╛рди рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЖрдкрдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЦреЗрддреЛрдВ рддрдХ рдХреЛрдИ рдкрд╣реБрдВрдЪ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрдпреЛрдВ рд╣реИ (рднрд▓реЗ рд╣реА, рдХрд╣реЗрдВ, рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ)ред

рдЗрди рдирд┐рдпрдореЛрдВ рд╕реЗ, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдХреЙрдкреА рд▓рд╛рдЧреВ рдХреА рдЧрдИ рддреЛ Copy рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдЯреНрд░рдХреНрдЪрд░ / рдПрдирдо рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рдкрд╡рд┐рддреНрд░рддрд╛ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА: рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЙрдкреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдВ:

union Foo { ... } // contents don't matter

рдпрд╣ рдорд┐рд▓рди рд╢рд╛рд▓реАрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Copy рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

union Bar { x: Rc<String> }
impl Copy for Bar { }
impl Clone for Bar { fn clone(&self) -> Self { *self } }

рдпрд╣ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ Bar рдХреЙрдкреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Copy рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ Bar рдПрдХ struct рдереЗ, рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Copy рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рдЬрд╣ рд╕реЗ x ред

рд╣реБрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВред =)

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рджреЗрдВред "рдмрд┐рдЯ рдмрдХреЗрдЯ" рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рдж, рдореИрдВ _still_ рдХреЛ рдЙрдореНрдореАрдж рд╣реЛрдЧреА рдХрд┐ рд╣рдо рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рд╕рдВрдШ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдПрдХ *mut T рдЗрд▓рд╛рдЬ рдХрд░реЗрдВ, рдФрд░ рдЖрдкрдХреЛ ptr::read рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрджрдореЛрдВ рдкрд░ рд░реЛрдХ рдХреНрдпреЛрдВ рд▓рдЧрд╛рдПрдВрдЧреЗред рдЗрд╕реЗ w / рдореВрд╡рд┐рдВрдЧ рдбреНрд░реЙрдк рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ - рдпрд╛ рд╢рд╛рдпрдж рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕реЗ "рд╕реНрдкрд╖реНрдЯ" рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ? рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред

@nikomatsakis

рдореЗрд░реА рд╡реГрддреНрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдПрдХ "рдмрд┐рдЯ-рдмрдХреЗрдЯ" рд╣реИрдВ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗред

рд╣рд╛, рдореИрдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдВрдШ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдЧрд╛рд░рдВрдЯреА рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдРрд╕реЗ рдЦрддрд░рдирд╛рдХ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрди рдПрдХ рдРрд╕рд╛ рдПрдирдо рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рд╡реЗрдЪрдХ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдо рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдпреВрдирд┐рдпрди рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рд╡реИрдз рдореВрд▓реНрдп рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ)ред

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рднреА рдЙрдзрд╛рд░ / рдЪрд╛рд▓ рдирд┐рдпрдо рдЗрд╕ рдЧрд╛рд░рдВрдЯреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдпрд╣ рд╕рдмрд╕реЗ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ "рд╕реБрд░рдХреНрд╖рд┐рдд" рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдЙрдкрдпреЛрдЧреА ) рдпрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ "рдмрд┐рдЯ рдмрдХреЗрдЯ" рд░рд╛рд╕реНрддрд╛, рдЬрдм рд░рд╕реНрдЯ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЗрд╕реЗ рдФрд░ рднреА рд░реВрдврд╝рд┐рд╡рд╛рджреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ https://github.com/rust-lang/rust/pull/36016#issuecomment -242810887 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ

@petrochenkov

рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрди рдПрдХ рдРрд╕рд╛ рдПрдирдо рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рд╡реЗрдЪрдХ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдо рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдпреВрдирд┐рдпрди рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рд╡реИрдз рдореВрд▓реНрдп рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ)ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╣рдореЗрд╢рд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдПрдХ рд╕рдВрдШ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣рд░ рдкрд╣реБрдВрдЪ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддреА рд╣реИред

рдореИрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рд╡реИрд╕рд╛ рд╣реА рд╕реЛрдЪрддрд╛ рд╣реВрдВред рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдШ рдПрдХ рдПрдирдо рдХреА рддрд░рд╣ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рде рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рдиреНрдп рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕реЗрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрднреА-рдХрднреА рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЗрдЯ рдЦрд╛рд▓реА рд╣реИ (рдпрд╛рдиреА, рдПрдирдо рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓рд┐рдиреЗрдЯреЗрдб рд╣реИ)ред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдирд┐рд╣рд┐рдд (рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд) рджрд╛рд╡реЗ рдХреЗ рд░реВрдк рдореЗрдВ some_union.field рдХрд╛ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдиреНрдп рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ field ред рдпрд╣ рдЙрдзрд╛рд░-рдЪреЗрдХрд░ рдПрдХреАрдХрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ; рдпрджрд┐ рдЖрдк x рдЙрдзрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ y рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рдПрдХ рд╕рд╛рде x рдФрд░ y (рдФрд░ рдпрд╣ рдЙрдзрд╛рд░ рд╣реИ)ред (рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдПрдирдо рдХреЗ рд╕рд╛рде , рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк

рд╡реИрд╕реЗ рднреА, рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рд╕рдВрдШ рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ "рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ", рддреЛ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЕрдм рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЧреНрд░реЗ рдЬрд╝реЛрди рдорд╛рдирддрд╛ рд╣реВрдВред

рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реЛрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рддрдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдвреАрд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВред

рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╕рдВрдШ рдкрд░ Copy рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рд╢рд░реНрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЗрди рдЧреНрд░реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдкрддреЗ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ!

рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдШ рдПрдХ рдПрдирдо рдХреА рддрд░рд╣ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рде рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

"рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реЗрд░рд┐рдПрдВрдЯ" рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдиреЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рд╣реИ - рдЗрди рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХрд▓ рд╕рдХреНрд░рд┐рдп рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╡реЗрд░рд┐рдПрдВрдЯ рддрдХ рднреА рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯрд┐рдВрдЧ рдЖрдо рддреМрд░ рдкрд░ рдЦрд░рд╛рдм рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдВрд╢рд┐рдХ рд▓рдХреНрд╖реНрдп рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдмрджрд▓рдирд╛)ред
рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╡реЗрд░рд┐рдПрдВрдЯ рдЕрднреА рднреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡реЗ рд╕рдВрдШ рдХреЗ рд╕рдХреНрд░рд┐рдп рд╕рдВрд╕реНрдХрд░рдг (рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рдкрд░рд┐рднрд╛рд╖рд╛) рдХреЗ рд╕рд╛рде рдпрд╛ рд╕рдВрдШ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЗрддрд┐рд╣рд╛рд╕ (рдЕрдзрд┐рдХ рдЕрд╕реНрдкрд╖реНрдЯ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА) рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд▓реЗрдЖрдЙрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрди рдЧреНрд░реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╣реИ

рдореИрдВ рдпреВрдирд┐рдпрди RFC рдХреЛ рдХреБрдЫ рджреВрд░рдЧрд╛рдореА рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ! "рдПрдирдо" рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдмрд╣реБрдд рдордЬреЗрджрд╛рд░ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред

рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░ рдкреНрд░рд╕рд╛рд░рдг рдЖрдо рддреМрд░ рдкрд░ рдЦрд░рд╛рдм рд╣реЛрддрд╛ рд╣реИ (рдЬрдм рддрдХ рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдВрд╢рд┐рдХ рд▓рдХреНрд╖реНрдп рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)

@petrochenkov рдпрд╣ рдореЗрд░реЗ рдорд┐рд░реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдорд┐рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рд╢реЗрдВрдирд┐рдЧрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд┐рд░реА рд╣реИрдВрдбрд▓ рдпреВрдирд┐рдпрдиреЛрдВ (рдХрдЪреНрдЪреА рдореЗрдореЛрд░реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕рд╛рдЗрдб рдкрд░ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд░рд╛рд╢рд┐ рдХрд╛ рдХрд╛рдо рд╣реЛрдЧрд╛ред

рдФрд░ @eddyb рдЬрдВрдЧреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рдорд┐рд░реА рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдкрд░ рдЬреЛрд░ рджреЗ рд░рд╣рд╛ рд╣реИред

@petrochenkov

"рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛" рдХреЗ рд╡рд┐рд░реВрджреНрдз рдПрдХ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ ...

рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд░рдирдЯрд╛рдЗрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдмрд╕реЗрдЯ рдореЗрдВ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рд╣рдо рд╣рдореЗрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рддрд░рд╣)ред рдпрд╣ рд╣реИ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдкреНрд░реЗрд╖рдг рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЕрд╡реИрдз рд╣реИред

рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╡реЗрд░рд┐рдПрдВрдЯ рдЕрднреА рднреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡реЗ рд╕рдВрдШ рдХреЗ рд╕рдХреНрд░рд┐рдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд▓реЗрдЖрдЙрдЯ рд╣реИрдВ рддреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╣рдореНрдо, рдореИрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╣рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ рдХрд┐ рд╕рдВрдШ рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдПрдХ рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред :)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЪрд╛рд▓ рдХреЗ рд╕рд╛рде рдЕрдЬреАрдм рдмрд╛рддрдЪреАрдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдбреЗрдЯрд╛ "рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ" рдПрдХ рдПрдХреНрд╕ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ рд╡рд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рдИ рдПрдл рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдПрдХреНрд╕ рд╣реИ?

рднрд▓реЗ рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкреВрд░реЗ рд╕рдВрдШ рдХреЛ рдЗрди рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рд╡реИрд░рд┐рдПрдВрдЯреНрд╕ рдХреЗ рд╕реЗрдЯ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рд╡рд┐рдЪрд╛рд░ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рднреА рдореМрдЬреВрджрд╛ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рд╡рд┐рдЪрд▓рди рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╡реЗрд░рд┐рдПрдВрдЯ рд╡реИрдз рд╕реЗрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЖрдкрдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ "рд╕рдВрдЪрд╛рд░рд┐рдд" рд╣реЛрдЧрд╛ (рдФрд░ рдореВрд▓ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдВ)ред

рдореИрдВ рдпреВрдирд┐рдпрди RFC рдХреЛ рдХреБрдЫ рджреВрд░рдЧрд╛рдореА рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ! "рдПрдирдо" рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдмрд╣реБрдд рдордЬреЗрджрд╛рд░ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред

рдРрд╕рд╛ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕! рдЖрдк рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ;)

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдорди рдореЗрдВ рдХреМрди рд╕реЗ рдареЛрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ, рдЗрд╕ рдкрд░ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВ?

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдорди рдореЗрдВ рдХреМрди рд╕реЗ рдареЛрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ, рдЗрд╕ рдкрд░ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВ?

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг (рдЕрд░реНрдерд╛рдд рдмреЗрд╣рддрд░ рдкреНрд░рд▓реЗрдЦрди), рдХреБрдЫ рдЫреЛрдЯреЗ рд╡рд┐рд╕реНрддрд╛рд░ (рдЬреИрд╕реЗ рдЦрд╛рд▓реА рд╕рдВрдШ рдФрд░ .. рд╕рдВрдШ рдкреИрдЯрд░реНрди рдореЗрдВ), рд╕рдВрдШ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреЛ рдореБрдЦреНрдп (рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА) рд╡рд┐рдХрд▓реНрдк - рдЕрдзрд┐рдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдХрдо рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ "рдЦрд░реЛрдВрдЪ рд╕реНрдерд╛рди" рд╡реНрдпрд╛рдЦреНрдпрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ "рдЕрдЬреНрдЮрд╛рдд рдЕрдЬреНрдЮрд╛рдд рднреЗрджрднрд╛рд╡ рдХреЗ рд╕рд╛рде рджреБрд╢реНрдордиреА" рд╡реНрдпрд╛рдЦреНрдпрд╛ - рдФрд░ рдЪрд╛рд▓ / рдЖрд░рдВрднреАрдХрд░рдг рдЪреЗрдХрд░ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдо, Copy рдирд┐рд╣рд┐рдд рд╣реИ, unsafe рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ, рдЖрджрд┐ред

рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╕рдордп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдпреВрдмреА

union U { a: u8, b: () }
let u = U { b: () };
let a = u.a; // most probably an UB, equivalent to reading from `mem::uninitialized()`

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд╕реАрдо рдореБрд╢реНрдХрд┐рд▓ рдХреНрд╖реЗрддреНрд░ рд╣реИред

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдХреНрд░реЙрд╕-рдлреАрд▓реНрдб рд╢рдмреНрджрд╛рд░реНрде рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕реВрдЪрдХ рдХрд╛рд╕реНрдЯ рд╕рд╣реА рд╣реИрдВ?
_ (_) рдХреЗ рд░реВрдк рдореЗрдВ * u8)

рдЧреБрд░реБрд╡рд╛рд░, 1 рд╕рд┐рддрдВрдмрд░ 2016 рдХреЛ рд╡рд╛рджрд┐рдо рдкреЗрдЯреНрд░реЛрдЪреЗрдирдХреЛрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @
рд▓рд┐рдЦрд╛ рдерд╛:

рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛
рдпреВрдмреА рд╣реИ, рдЙрджрд╛

рдпреВрдирд┐рдпрди U {a: u8, b: ()}
рдЪрд▓реЛ рдпреВ = рдпреВ {рдмреА: ()};
рдЪрд▓реЛ рдПрдХ = ua; // рд╕рдмрд╕реЗ рд╢рд╛рдпрдж рдПрдХ рдпреВрдмреА, mem::uninitialized() рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд╕реАрдо рдореБрд╢реНрдХрд┐рд▓ рдХреНрд╖реЗрддреНрд░ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32836#issuecomment -244154751,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABxXhi68qRITTFW5iJn6omZQQBQgzweNks5qlw4qgaJpZM4IDXsj
ред

рдХреНрдпрд╛ рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рд╣рдореЗрд╢рд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ?

рдЧреБрд░реБрд╡рд╛рд░, 1 рд╕рд┐рддрдВрдмрд░ 2016 рдХреЛ рд╡рд╛рджрд┐рдо рдкреЗрдЯреНрд░реЛрдЪреЗрдирдХреЛрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @
рд▓рд┐рдЦрд╛ рдерд╛:

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдорди рдореЗрдВ рдХреМрди рд╕реЗ рдареЛрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ, рдЗрд╕ рдкрд░ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВ?

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг (рдЕрд░реНрдерд╛рдд рдмреЗрд╣рддрд░
рдкреНрд░рд▓реЗрдЦрди), рдХреБрдЫ рдЫреЛрдЯреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдЬреИрд╕реЗ рдЦрд╛рд▓реА рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ .. рд╕рдВрдШ рдореЗрдВ
рдкреИрдЯрд░реНрди), рд╕рдВрдШ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреЛ рдореБрдЦреНрдп (рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА) рд╡рд┐рдХрд▓реНрдк - рдЕрдзрд┐рдХ
рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдХрдо рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ "рд╕реНрдХреНрд░реИрдЪ рд╕реНрдкреЗрд╕" рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд
рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ "рдЕрдЬреНрдЮрд╛рдд рд╡рд┐рд╡реЗрдХрд╣реАрди" рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рджреБрд╢реНрдордиреА - рдФрд░
рдореВрд╡ / рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЪреЗрдХрд░ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдо, рдХреЙрдкреА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ, рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛
рдХреНрд╖реЗрддреНрд░ рдХреА рдкрд╣реБрдВрдЪ, рдЖрджрд┐ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32836#issuecomment -244151164,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABxXhuHStN8AFhR3KYDU27U29MiMpN5Bks5qlws9gaJpZM4IDXsj
ред

рдХреНрдпрд╛ рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рд╣рдореЗрд╢рд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ?

рдЗрд╕реЗ рдХрднреА-рдХрднреА рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ

  • рддреБрдЪреНрдЫ-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
  • union U { f1: T, f2: T, ..., fN: T } (рдпрд╛рдиреА рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░) рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХреЛрдИ рднреА рдкрд╣реБрдВрдЪ "рдЕрдЬреНрдЮрд╛рдд рд╡рд┐рд╡реЗрдХрд╣реАрди рд╡реНрдпрд╛рдЦреНрдпрд╛" рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╢рд░реНрддреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдмрд╕ рдЗрд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╣реЗрдВ, рд╣рдореЗрд╢рд╛ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧрд┐рдЯ рд╕реЗ рдирд╡реАрдирддрдо рдЬрдВрдЧ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд╛ рдкрд░реАрдХреНрд╖рдгред рдореИрдВрдиреЗ рдЬреЛ рднреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдбреЗрдб рдлреАрд▓реНрдб рдЪреЗрдХрд░ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓реЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

#![feature(untagged_unions)]

union U {
    i: i32,
    f: f32,
}

fn main() {
    println!("{}", std::mem::size_of::<U>());
    let u = U { f: 1.0 };
    println!("{:#x}", unsafe { u.i });
}

рдЖрдкрдХреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:

warning: struct field is never used: `f`, #[warn(dead_code)] on by default

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ dead_code рдЪреЗрдХрд░ рдиреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

(рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдХреНрд╖реЗрддреНрд░" рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреАрдЖрд░ # 36252 рджрд╛рдпрд░ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕реЗ рдХреЗрд╡рд▓ "рдлрд╝реАрд▓реНрдб" рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред)

рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдХрд╛рд░ рдХреЗ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди RFC рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

#![feature(untagged_unions)]

union Foo<T: ?Sized> {
  value: T,
}

рдЖрдЙрдЯрдкреБрдЯ:

error[E0277]: the trait bound `T: std::marker::Sized` is not satisfied
 --> <anon>:4:5
  |
4 |     value: T,
  |     ^^^^^^^^ trait `T: std::marker::Sized` not satisfied
  |
  = help: consider adding a `where T: std::marker::Sized` bound
  = note: only the last field of a struct or enum variant may have a dynamically sized type

рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреАрд╡рд░реНрдб рдореЙрдбреНрдпреВрд▓ / рдЯреЛрдХрд░рд╛ рд░реВрдЯ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

fn main() {
    // all work
    struct Peach {}
    enum Pineapple {}
    trait Mango {}
    impl Mango for () {}
    type Strawberry = ();
    fn woah() {}
    mod even_modules {
        union WithUnions {}
    }
    use std;

    // does not work
    union Banana {}
}

рдПрдХ рд╕реБрдВрджрд░ рдЧрдВрджрд╛ рд╕реНрдерд┐рд░рддрд╛ рдорд╕реНрд╕рд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

@nagisa
рдХреНрдпрд╛ рдЖрдк рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдЬрдВрдЧ рдХреЗ рдХреБрдЫ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл playpen рдкрд░ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (modulo "рдЦрд╛рд▓реА рдпреВрдирд┐рдпрди" рддреНрд░реБрдЯрд┐рдпрд╛рдВ)ред
рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рди-рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдЬрд╛рдБрдЪ рднреА рд╣реИ - https://github.com/rust-lang/rust/blob/master/src/test/run-pass/union/union-backcomp.rsред

@petrochenkov рдЖрд╣, рдореИрдВрдиреЗ play.rlo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ stable рдпрд╛ рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрднреА рдорди рдХрд░рддрд╛ рд╣реИ рддреЛ рдХрднреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЕрдВрддрддрдГ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рджреБрд╖реНрдЯ рдЬреБрдбрд╝рд╡рд╛рдУрдВ _safe рдлрд╝реАрд▓реНрдб_ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
cc https://github.com/rust-lang/rfcs/issues/381#issuecomment -248707010

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ "рд╕реБрд░рдХреНрд╖рд┐рдд рдпреВрдирд┐рдпрдиреЛрдВ" рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдШ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреИрд░-рдбреНрд░реЙрдк рдлрд╝реАрд▓реНрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рд╕рднреА рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде, рд╕реБрд░рдХреНрд╖рд┐рдд рд▓рдЧрддреЗ рд╣реИрдВ; рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЦреЗрддреЛрдВ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдбреЗрдЯрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

@joshtriplett рдЖрдкрдХреЛ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреЛрдИ "рдЫреЗрдж" рди рд╣реЛ, рдПрдХрддрд░рдлрд╛ рдбреЗрдЯрд╛ рдкрдврд╝ рд╕рдХрддреЗ рдереЗред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: "рдЧреИрд░-рд╕рдВрдЧрдард┐рдд рдбреЗрдЯрд╛ рдпрд╛ рддреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдпрд╛ рдЖрдкрдХреА SSH рдирд┐рдЬреА рдХреБрдВрдЬреА рд╣реИ, рдЬреЛ рднреА рдмрджрддрд░ рд╣реИред"

рдХреНрдпрд╛ &T рдХреЙрдкреА рдФрд░ рдиреЙрди-рдбреНрд░реЙрдк рдирд╣реАрдВ рд╣реИ? usize "

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдШ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреИрд░-рдбреНрд░реЙрдк рдлрд╝реАрд▓реНрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рд╕рднреА рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде, рд╕реБрд░рдХреНрд╖рд┐рдд рд▓рдЧрддреЗ рд╣реИрдВ; рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЦреЗрддреЛрдВ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдбреЗрдЯрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдСрдл-рдж-рдХрдл рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдПрдХ рдЧрдВрднреАрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЪрд╛рд▓ рд╣реИ:

  • u8 рдФрд░ bool рдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ u8 рдорд╛рди bool рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╣реИрдВ рдФрд░ рдЗрд╕ рдЯреНрд░рд┐рдЧрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ UB
  • &T рдФрд░ &U рдПрдХ рд╣реА рдЖрдХрд╛рд░ рд╣реИ рдФрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ Copy + !Drop рдХреЗ рд▓рд┐рдП рд╕рднреА T рдФрд░ U (рджреЛрдиреЛрдВ рдпрд╛ рди рд░рд╣реЗ, рдЬрдм рддрдХ рдХрд┐ Sized )
  • uN / iN рдФрд░ fN рдмреАрдЪ рд╕рдВрдкреНрд░реЗрд╖рдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рд╣рдореЗрд╢рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛ рдХреЛ рдмрдбрд╝рд╛ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдЧреЛрдкрдиреАрдпрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдирд╛ (рдЬреИрд╕реЗ struct Foo(Bar); рдФрд░ Bar рдмреАрдЪ рдХрд╛ рдзреВрд░реНрддрддрд╛) рд╕реНрд╡рд╛рдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛрдкрдиреАрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@Amanieu рдЬрдм рдореИрдВ рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛ рдХрд┐, рдореИрдВ рдХрд┐рд╕реА рднреА рдЖрдВрддрд░рд┐рдХ рдкреИрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдРрд╕рд╛ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рдЙрд╕ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@cuviper рдореИрдВ "рд╕рд╛рджреЗ рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореЗрдВ рдХреБрдЫ рд╣реИред рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╕рдВрднрд╡рдд: рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдордд рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╡реНрд╣рд╛рдЗрдЯрд▓рд╛рдЗрдирд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИред

@rkruppe

u8 рдФрд░ рдмреВрд▓ рдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ u8 рдорд╛рди рдмреВрд▓ рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╣реИрдВ рдФрд░ рдЗрд╕ рдЯреНрд░рд┐рдЧрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ UB

рдЕрдЪреНрдЫреА рдмрд╛рдд; рдпрд╣реА рдореБрджреНрджрд╛ рдПрдирдореЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

& T рдФрд░ U рдХрд╛ рдЖрдХрд╛рд░ рдПрдХ рдЬреИрд╕рд╛ рд╣реИ рдФрд░ рд╕рднреА + рдФрд░ U (рдЬрдм рддрдХ рджреЛрдиреЛрдВ рд╣реА рдЖрдХрд╛рд░ рдХреЗ рдирд╣реАрдВ рд╣реИрдВ) рдХреЗ рд▓рд┐рдП Copy + Drop рд╣реИрдВред

рдореИрдВ рд╡рд╣ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред

рдпреВрдПрди / рдЖрдИрдПрди рдФрд░ рдПрдлрдПрди рдХреЗ рдмреАрдЪ рдкреНрд░рд╕рд╛рд░рдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рд╣рдореЗрд╢рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛ рдХреЛ рдмрдбрд╝рд╛ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕рд╣рдорддрд┐; рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред

рдЧреЛрдкрдиреАрдпрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдлреВ (рдмрд╛рд░) рдФрд░ рдмрд╛рд░ рдХреЗ рдмреАрдЪ рдЪрдХрд╛рдЪреМрдВрдз) рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрдкрдиреАрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рдХреНрдпрд╛ рдЗрдВрдЯрд░реНрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рдкреИрдбрд┐рдВрдЧ рдирд╣реАрдВ)ред рдЗрд╕рд▓рд┐рдП рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдШрдЯрдХ рд╕рд╛рджреЗ-рдкреБрд░рд╛рдиреЗ-рдбреЗрдЯрд╛, рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реЛрдВ, рдФрд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рджреГрд╢реНрдпрддрд╛ рд╣реЛред

рдпреВрдПрди / рдЖрдИрдПрди рдФрд░ рдПрдлрдПрди рдХреЗ рдмреАрдЪ рдкреНрд░рд╕рд╛рд░рдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рд╣рдореЗрд╢рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛ рдХреЛ рдмрдбрд╝рд╛ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдореЗрдВ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ NaN рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЯреНрд░реИрдк рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк UB рд╣реЛрддрд╛ рд╣реИред

@ retep998 рд░рд╕реНрдЯ рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдЬреЛ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдЯреНрд░реИрдк рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? (рдпрд╣ рдпреВрдмреА рдореБрджреНрджреЗ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╣рдо рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)

@petrochenkov

рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдПрдХ рдкрд╣реЗрд▓реА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рд╡реЗрдЪрдХ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдо рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рд╕рдВрдШ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рд╡реИрдз рдореВрд▓реНрдп рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЖрдпрд╛ рд╣реВрдВ - рдареАрдХ рд╣реИ, _exactly_ рдпрд╣ рдирд╣реАрдВред рдореИрдВ рдЕрднреА рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рдиреВрдиреА рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рд╕рдВрдШ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдПрдХ "рдХреНрд╡рд╛рдВрдЯрдо рд░рд╛рдЬреНрдп" рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рддрд░рд╣ рдереЛрдбрд╝рд╛ рд╕реЛрдЪрддрд╛ рд╣реВрдВ - рдпрд╣ рдЕрдм рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдХрд╛рдиреВрдиреА рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рдЗрд╕реЗ "рдордЬрдмреВрд░" рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрджрд┐ рд╡рд╣ рдкреНрд░рдХрд╛рд░ Copy )ред рддреЛ So, рдореВрд▓ рд░реВрдк рд╕реЗред

#[repr(C)] рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди: рдЬреИрд╕рд╛ рдХрд┐ @pnkfelix рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдерд╛, рд╡рд░реНрддрдорд╛рди рдХрд▓реНрдкрдирд╛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╕рдВрдШ #[repr(C)] , рддреЛ рдЗрд╕реЗ x рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдЕрд╡реИрдз рд╣реИ рдлрд╝реАрд▓реНрдб y ред рд╕рдВрднрд╡рдд: рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рдСрдлрд╕реЗрдЯ рдкрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝рд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдиреБрдо (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рдВрд░рдЪрдирд╛ ...) рдХреА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕реА рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдбрд╛рд▓рддреЗ рд╣реИрдВред

_But_ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлреБрдЯрдЧрди рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЙрди рд░реАрдкреНрд░реЗрдВрдЯ рдЧрд╛рд░рдВрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣рдо рдХрднреА рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ _actually_ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрдВрдЧрд▓реА рдореЗрдВ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдВрдЧреЗред

рд╡рд┐рдЪрд╛рд░?

@nikomatsakis

рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдПрдХ рдкрд╣реЗрд▓реА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рд╡реЗрдЪрдХ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдо рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рд╕рдВрдШ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рд╡реИрдз рдореВрд▓реНрдп рд╣реИ

рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╣рд┐рд╕реНрд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг / рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ, рдЬреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд╕реБрд▓рдн рд╣реИрдВред
рдЗрд╕ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

union U {
    a: (u8, bool),
    b: (bool, u8),
}
fn main() {
    unsafe {
        let mut u = U { a: (2, false) };
        u.b.1 = 2; // turns union's memory into (2, 2)
    }
}

рд╕рднреА рдХреНрд╖реЗрддреНрд░ Copy , рдХреЛрдИ рднреА рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЪреЗрдХрд░ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреБрд╢ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХреНрд╖реЗрддреНрд░ b рдХреЗ рдЖрдВрд╢рд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ 0 рд╡реИрдз рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрд╛ рдЬрд╛рдПред рдРрд╕реЗ рдХрд░реЗрдВ рдпреВрдмреА? рд╡реНрдпрд╛рдЦреНрдпрд╛ рдмрджрд▓реЗрдВ? рдХреБрдЫ рдФрд░?

@petrochenkov

рдРрд╕реЗ рдХрд░реЗрдВ рдпреВрдмреА?

рдпрд╣ рдореЗрд░реА рдзрд╛рд░рдгрд╛ рд╣реЛрдЧреА, рд╣рд╛рдБред рдЬрдм рдЖрдкрдиреЗ a рд╕рд╛рде рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛, рддреЛ рд╡реЗрд░рд┐рдПрдВрдЯ b рдорд╛рдиреНрдп рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдирд╣реАрдВ рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ u.b.1 (рдЪрд╛рд╣реЗ рдкрдврд╝рдиреЗ рдпрд╛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдорд╛рдиреНрдп рд╣реИред

# [ Repr (C)] рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди: рдЬреИрд╕рд╛ рдХрд┐

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЙрдкрдпреБрдХреНрдд рд╢рдмреНрджрд╛рдВрдХрди рдпрд╣ рд╣реИ рдХрд┐ 1) рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реЗ рдкрдврд╝рдирд╛ рдЬреЛ "рд▓реЗрдЖрдЙрдЯ рд╕рдВрдЧрдд" рдирд╣реАрдВ рд╣реИрдВ (рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ) рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдлрд╝реАрд▓реНрдб / рдлрд╝реАрд▓реНрдб-рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдпреВрдмреА 2 рд╣реИ) #[repr(C)] рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЖрдЙрдЯ рдХреНрдпрд╛ рд╣реИрдВ (рдПрдмреАрдЖрдИ рдбреЙрдХреНрд╕ рд╕реЗ) рдЗрд╕рд▓рд┐рдП рд╡реЗ рдпреВрдмреА рдФрд░ рдЧреИрд░-рдпреВрдмреА 3 рдХреЗ рдмреАрдЪ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) #[repr(Rust)] рдпреВрдирд┐рдпрди рд▓реЗрдЖрдЙрдЯ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рдХрд┐ UB рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо (rustc / libstd + рдЕрдкрдирд╛) рдкрд░реАрдХреНрд╖рдг) рдХреЗ рдкрд╛рд╕ рдпрд╣ рдкрд╡рд┐рддреНрд░ рдЬреНрдЮрд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреЗрд╣реВрдБ рдХреЛ рдЭрд╛рдбрд╝реВ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЧреИрд░-рдпреВрдмреА рдлреИрд╢рди рдореЗрдВ #[repr(Rust)] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

4) рдЖрдХрд╛рд░ / рд╕реНрдЯреНрд░рд╛рдЗрдб рдФрд░ рдлреАрд▓реНрдб рд░реАрдСрд░реНрдбрд░рд┐рдВрдЧ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рдпреВрдирд┐рдпрди рд▓реЗрдЖрдЙрдЯ рдХреЛ рдкрддреНрдерд░ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЗрдЖрдЙрдЯ рдХреЛ рднреА рдЬрд╛рди рд╕рдХреЗрдВ рдФрд░ #[repr(Rust)] рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ #[repr(C)] рдФрд░ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдЧреАред

@nikomatsakis рдпреВрдирд┐рдпрди RFC рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ, рд▓реЛрдЧреЛрдВ рдиреЗ рджреЗрд╢реА рд░рд╕реНрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬреЛ рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ #[repr(C)] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдХреБрдЫ рд░реБрдХ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореБрдЭреЗ #[repr(Rust)] рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдЗрд╕реЗ "рдпрд╣рд╛рдБ рдбреНрд░реЗрдЧрди" рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред рд╕рдВрднрд╡рддрдГ рдПрдХ рд▓рд┐рдВрдЯ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рд╣реИ рдЬреЛ #[repr(C)] ред

@ retep998 рдпрд╣ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ repr(Rust) рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд▓реЗрдЖрдЙрдЯ рдпрд╛ рдУрд╡рд░рд▓реИрдк рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдмрд╕ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ repr(Rust) рдХреЛ рд╕рдВрдШ рдХреА рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреА рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рддреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП ("рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рджрд╕реНрдп рд╕реЗ рдмрдбрд╝рд╛ рдирд╣реАрдВ")ред

рдХреНрдпрд╛ рд░рд╕реНрдЯ рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдЬреЛ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдЯреНрд░реИрдк рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд╕реНрд╡рдпрдВ рдЯреНрд░реИрдк рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рдпреВрдмреА-рдиреЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рд╕реНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдлрдкреА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлреБрдЯрдЧрди рд╣реИ, рдФрд░ рдЙрди рдкреБрдирд░реНрдореБрджреНрд░рдг рдЧрд╛рд░рдВрдЯреАрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдмрджрд▓ рдкрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрдВрдЧрд▓реА рдореЗрдВ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдВрдЧреЗред

рд╡рд┐рдЪрд╛рд░?

рдПрдХ рд▓рд┐рдВрдЯ рдпрд╛ рдХреБрдЫ рдРрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдПрдХ рд╢рд┐рдХрд╛рдпрдд рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрджрд┐ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдПрдХ рдлрд╝реАрд▓реНрдб рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдирдо рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред MIR- рдЖрдзрд╛рд░рд┐рдд рд▓рд┐рдВрдЯ рдЙрд╕ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдХреЛрдИ рд╕реАрдПрдлрдЬреА рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рднрд╛рд░ рдХреА рд╡реИрдзрддрд╛ рдкрд░ рдХреЛрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЧрд▓рддреА рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдмрд┐рдирд╛ рд░реБрд╕реНрдЯ рдЖрдИрдПрдордУ рдХреЛ рдмрддрд╛рдПред

If: рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡реА рдЕрдЧрд░ рд▓реЛрдЧ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдПрдХ рдЧрд░реАрдм рдЖрджрдореА рдХреЗ рд╕рдВрдЪрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдШ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рд╕рдВрдШ рдХреЗ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреА рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рддреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП ("рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рджрд╕реНрдп рд╕реЗ рдмрдбрд╝рд╛ рдирд╣реАрдВ")ред

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдорд╢реАрди рд╢рдмреНрдж рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ repr(Rust) рд╕рд╛рдорд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕рдордЭ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдореБрджреНрджрд╛ https://github.com/rust-lang/rust/issues/37479 рд╣реИред рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ LLDB рдбрд┐рдмрдЧрд┐рдВрдЧ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :(

@alexcrichton GDB рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдореИрдВ рдЬреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рд╛рдВ рд╕реЗред рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдмреЙрдЯреНрд╕ рдкрд░реАрдХреНрд╖рдг рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдлрд┐рд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рд╕рднреА рд╕рд╣реА рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрд▓рдПрд▓рдбреАрдмреА рдХреЗ рдкрд╛рд╕ рдмрд╕ рдпрд╣рд╛рдВ рдПрдХ рдмрдЧ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрдИ рдбреАрдмрдЧрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмрдЧ, рджреВрд╕рд░реЗ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрд▓рдПрд▓рдбреАрдмреА рдХреЛ рд╕рд┐рд░реНрдл рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ FCP 1.17 рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП (рдпрд╣ рдорд╛рд░реНрдЪ 16 рдмреАрдЯрд╛ рд╣реИ)ред рдХреНрдпрд╛ рдХреЛрдИ рднреА рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдлреАрдЪрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджреЗ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЖрдо рд╕рд╣рдорддрд┐ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@withoutboats
рдореЗрд░реА рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ

  • рдЖрдЧрд╛рдореА рд░рд┐рд▓реАрдЬ (3 рдлрд░рд╡рд░реА) рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
  • Copy рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░реЗрдВред рдпрд╣ рдПрдлрдПрдлрдЖрдИ рдХреА рд╕рднреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ - рдПрдлрдПрдлрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд┐рд░ рдкрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред "POD" рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ C / C ++ рдореЗрдВ рджрд╢рдХреЛрдВ рддрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ (modulo type based aliasing, рд▓реЗрдХрд┐рди Rust рдХреЗ рдкрд╛рд╕ рдпрд╣ рдирд╣реАрдВ рд╣реИ), рдХреЛрдИ рдЬреНрдЮрд╛рдд рдЕрд╡рд░реЛрдзрдХ рднреА рдирд╣реАрдВ рд╣реИрдВред
  • 3 рдлрд░рд╡рд░реА рддрдХ "рдпреВрдирд┐рдпрдВрд╕ 1.2" рдЖрд░рдПрдлрд╕реА рд▓рд┐рдЦреЗрдВред рдпрд╣ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ред рдЧреИрд░- Copy рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рднрд╡рд┐рд╖реНрдп рдЗрд╕ RFC рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ ManuallyDrop рдпрд╛ NoDrop рддрд░рд╣ рдХреБрдЫ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕реНрдерд┐рддрд┐ рдЕрджреНрдпрддрди (4 рдлрд░рд╡рд░реА): рдореИрдВ рдЖрд░рдПрдлрд╕реА рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдХреНрдп рдХреЗ рдмрд╛рдж рд▓реЗрдЦрдХ рдХрд╛ рдмреНрд▓реЙрдХ рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдорд╛рдкреНрдд рдХрд░ рджреВрдВрдЧрд╛ (рдлрд░рд╡рд░реА 11-12) рдФрд░ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд╣реАрдВ (рдлрд░рд╡рд░реА 4-5)ред
рд╕реНрдерд┐рддрд┐ рдЕрджреНрдпрддрди (11 рдлрд░рд╡рд░реА): рдкрд╛рда 95% рддреИрдпрд╛рд░ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдХрд▓ рдЬрдорд╛ рдХрд░реВрдВрдЧрд╛ред

@petrochenkov рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

@petrochenkov рдпрд╣ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдпреВрдирд┐рдпрдиреЛрдВ 1.2 рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рднреА рд╕рдореАрдХреНрд╖рд╛ рдХреА, рдФрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХреАрдВ; рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдпрд╣ рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

@joshtriplett рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐, рдЬрдмрдХрд┐ @ рдЬрдВрдЧ-рд▓рдВрдЧ / рд▓рдВрдЧ рдореАрдЯрд┐рдВрдЧ рдореЗрдВ рд╣рдордиреЗ рдЪреЗрдХ-рд▓рд┐рд╕реНрдЯ рдХреЛ рдЕрджреНрдпрддрд┐рдд рд░рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП - рд╣рдо рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ @rfcbot рдХреЗ рд╕рд╛рде)ред рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрд╢реЛрдзрди рдЖрд░рдПрдлрд╕реА) рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ред рд╣рдо рд╕рдордп рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рддрдм рддрдХ рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдордиреЗ рдЦреБрд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░реЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ "рд╕реБрд▓рдЭрд╛" рд▓рд┐рдпрд╛ рд╣реИред рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдХреЛ рдПрдХ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдпрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдореБрджреНрджрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдпрд╣рд╛рдВ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрджрдо рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИ - рдФрд░ рдРрд╕рд╛ рдХреЛрдИ рднреА рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдмреЗрд╢рдХ, рди рд╕рд┐рд░реНрдл @ рдЬрдВрдЧ-рд▓рдВрдЧ / рд▓рдВрдЧ рд╕рджрд╕реНрдп рдпрд╛ рдЪрд░рд╡рд╛рд╣реЗред

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ "рдпреВрдирд┐рдпрдВрд╕ 1.2" рдЖрд░рдПрдлрд╕реА - https://github.com/rust-lang/rfcs/pull/1897 рдЬрдорд╛ рдХрд┐рдпрд╛ рд╣реИред

рдЕрдм рдореИрдВ рд╕рдВрдШ рдХреЗ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рд╕рдВрдШ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ Copy рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд╝реАрд▓реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдВрдШ рдХреЛ Drop рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред
(рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдШ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд▓рдкреЗрдЯрдХрд░ рдФрд░ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП Drop рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)
рдЗрд╕ рддрд░рд╣ рдХреА рдпреВрдирд┐рдпрдиреЗрдВ рдПрдлрдПрдлрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕рднреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрднреЛрдХреНрддрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

"рдпреВрдирд┐рдпрдиреНрд╕ 1.2" рдЖрд░рдПрдлрд╕реА рдХрд╛ рдкрд╛рда рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдлрдПрдлрдЖрдИ-рд╢реИрд▓реА рдХреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : "рдпреВрдирд┐рдпрди 1.2" рдЖрд░рдПрдлрд╕реА рднреА рддреБрдЪреНрдЫ-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА Copy рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рджреЗрдЦреЗрдВ https://github.com/rust-lang/rust/issues/32836#uuecomment-281296416, https) : //github.com/rust-lang/rust/issues/32836#issuecomment-281748451), рдпрд╣ рдПрдлрдПрдлрдЖрдИ-рд╢реИрд▓реА рдХреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдкрд╛рда рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
"рдЕрд╡рд▓реЛрдХрди" рдЕрдиреБрднрд╛рдЧ рдХреЛ рдкреБрд╕реНрддрдХ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдВ "рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╛рдЗрди"ред

ping @nikomatsakis

рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдХреЛ рднрд╛рд╖рд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдереЛрдбрд╝рд╛ unsafe рдФрд░ ptr::write() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдШ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджрд╕реНрддрдХ рджреЗрдиреЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрднрдЧ 20 рдорд┐рдирдЯ рд▓рдЧреЗред

use std::mem;
use std::ptr;


/// A union of `f64`, `bool`, and `i32`.
#[derive(Default, Clone, PartialEq, Debug)]
struct Union {
    data: [u8; 8],
}

impl Union {
    pub unsafe fn get<T>(&self) -> &T {
        &*(&self.data as *const _ as *const T)
    }

    pub unsafe fn set<T>(&mut self, value: T) {
        // "transmute" our pointer to self.data into a &mut T so we can 
        // use ptr::write()
        let data_ptr: &mut T = &mut *(&mut self.data as *mut _ as *mut T);
        ptr::write(data_ptr, value);
    }
}


fn main() {
    let mut u = Union::default();
    println!("data: {0:?} ({0:#p})", &u.data);
    {
        let as_i32: &i32 = unsafe { u.get() };
        println!("as i32: {0:?} ({0:#p})", as_i32);
    }

    unsafe {
        u.set::<f64>(3.14);
    }

    println!("As an f64: {:?}", unsafe { u.get::<f64>() });
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреЛ рдХреБрдЫ рдРрд╕рд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рд╕рд░рдгреА рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред рддрдм рдореЗрд░реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп (рдФрд░ рдЫрд┐рдкрдХрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд) get::<T>() рдмрдЬрд╛рдп рд╡реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдирд╛рдорд╛рдВрдХрд┐рдд рдлрд╝реАрд▓реНрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

union! { Foo(u64, Vec<u8>, String) };

рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ, рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдпред рдкреНрд▓рд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рди рд╣реЛред

@ рдорд╛рдЗрдХрд▓-рдПрдл-рдмреНрд░рд╛рдпрди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рд░рдВрддрд░ size_of рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИред

@ рдорд╛рдЗрдХрд▓-рдПрдл-рдмреНрд░рд╛рдпрди рдпрд╣ [u8] рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рд╕рдВрд░реЗрдЦрдг рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдирд┐рд░рдВрддрд░ size_of рдФрд░ align_of рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдШреЛрд╖рдгрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ I рдореЗрдВ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рд╣реИред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдпреВрдирд┐рдпрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЗрд╕ рд╕рдордп рдХрдард┐рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХреБрдЫ рдбрд┐рдлреЙрд▓реНрдЯ рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╡реИрд▓реНрдпреВ рдХреЛ рдЙрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ (рдпрд╛ рдпреВрдирд┐рдпрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рдХреЛ рдЬреЛрдбрд╝реВрдБ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рд╣реИред рд╕рдВрдШ рдХрд╛)ред рдпрд╣ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реИ рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╕рдорд░реНрдерди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдФрд░ рдмрджрд╕реВрд░рдд рд╣реЛрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ RFC рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рд╣реБрдИ рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЖрдк рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИред

рдФрд░ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдиред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рдЪрд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдм syn рдореМрдЬреВрдж рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдПрдПрд╕рдЯреА рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рджреЛ рдЖрдЗрдбреЗрдВрдЯ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ ( Ident рд▓рд╛рдЧреВ AsRef<str> ), рдлрд┐рд░ рдПрдХ рдирдпрд╛ Ident рдмрдирд╛рдПрдБ Ident::From<String>() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдВрдШрдЯрди рд╣реИред

RFC рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдореИрдХреНрд░реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЛрдЭрд┐рд▓ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ syn рдФрд░ quote рдЬреИрд╕реЗ рдЯреЛрдХрд░реЗ рдХреЗ рд╣рд╛рд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде, рдЕрдм рдореИрдХреНрд░реЛ рдХреА рдЦрд░реАрдж рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдХрдо рддреНрд░реБрдЯрд┐ рд╡рд╛рд▓рд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ MyUnion::default() рдЬреЛ рдХрд┐ рд╕рдВрдШ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХрд╛ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рд╣реИ, рдлрд┐рд░ fn MyUnion::new<T>(value:T) -> MyUnion , рдЬрд╣рд╛рдВ T рдХрд╛ рдПрдХ рдРрд╕рд╛ рдЧреБрдг рд╣реИ рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕рд╣реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

рд╕рдВрд░реЗрдЦрдг рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреНрдпрд╛ рдЖрдк рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ mem рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ (рдпрд╛рдиреА std :: mem :: align_of () рдФрд░ рдорд┐рддреНрд░)? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕рдордп рдкрд░ рдЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред 99.9% рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрд╕реЗ рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрд░реЗрдЦрдг рдпрд╛ рдЖрдХрд╛рд░ (рд╕рдВрднрд╡рддрдГ рд╕рдВрдХрд▓рдХ рд╕реЗ рдкреВрдЫ рд░рд╣рд╛ рд╣реИ) рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╕реНрддрд╛рд░)ред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ, рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдлрдПрдлрдЖрдИ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╡реИрд╕реЗ рднреА рдПрдХ рдкрддрд▓реА рдЕрдореВрд░реНрдд рдкрд░рдд рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдЖрдк рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдЧрд░ / рдЕрдиреНрдпрдерд╛ рдмрдпрд╛рди рдпрд╛ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред

рд╕рдВрд░реЗрдЦрдг рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреНрдпрд╛ рдЖрдк рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдореЗрдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ (рдпрд╛рдиреА std :: mem :: align_of () рдФрд░ рдорд┐рддреНрд░)?

рдпрд╣ рдХрд┐рд╕реА рднреА рдХреНрд░реЙрд╕ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред

@ рдорд╛рдЗрдХрд▓-рдПрдл-рдмреНрд░рд╛рдпрди рдЗрди рд╕рднреА рдЪрд░реНрдЪрд╛рдУрдВ рдФрд░ рдмрд╣реБрдд рд╕реЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ https://github.com/rust-lang/rfcs/pull/1444 рдореЗрдВ рдереЗ ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдЬрд╡рд╛рдмреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдЖрдкрдХреЛ рд╣рд░ рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо / рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкреИрдбрд┐рдВрдЧ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдирд┐рдпрдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдкрдиреЗ рдПрдлрдПрдлрдЖрдИ рдХреЛрдб (рдЬреЛ рдХрд┐ @ retep88 ) рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдФрд░ рдЕрдЬреАрдмрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рдЙрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЦрд░реАрдж рдореИрдХреНрд░реЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ; рдЖрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рдмрдврд╝рд╛ рд╕рдХрддреЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛:

99.9% рд╕рдордп рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╡реИрд╕реЗ рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рд╕рдЪ рдирд╣реАрдВ рд╣реИред C рдХреЛрдб рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ "рд╕рдВрдШреЛрдВ рдХреЗ рд╕рдВрдШреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛" рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред

@rfcbot fcp рдорд░реНрдЬ рдкреНрд░рддрд┐ @petrochenkov рдХреА рдЯрд┐рдкреНрдкрдгреА https://github.com/rust-lang/rust/issues/32836#issuecomment -279256434

рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдмреЙрдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИ

рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп @withoutboats рдиреЗ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдмрд╛рдХреА рдЯреИрдЧ рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рд╣реИ:

  • [x] @ рдиреНрдпреВрдЯрди
  • [x] @ рд╣реЗрдбреНрдбреА
  • [x] @ рдореБрдиреЛрдордХреЛрддреНрд╕рдХрд┐рд╕
  • [x] @nrc
  • [x] @pnkfelix
  • [x] @withoutboats

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВред

рдПрдХ рдмрд╛рд░ рдЬрдм рдпреЗ рд╕рдореАрдХреНрд╖рдХ рдЖрдо рд╕рд╣рдорддрд┐ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдкрд░ рдирд╣реАрдВ рдЙрдард╛рдП рдЧрдП рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдЙрдард╛рдПрдВ!

рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдореБрдЭреЗ рдХреНрдпрд╛ рдЯреИрдЧ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

PSA: рдореИрдВ "Unions 1.2" RFC рдХреЛ FFI- рд╢реИрд▓реА рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдФрд░ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ - рдореИрдВ RFC рдХреЛ "рднрд╡рд┐рд╖реНрдп рдХреЗ рдирд┐рд░реНрджреЗрд╢" рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рддреБрдЪреНрдЫ-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред

union.trivially_destructible_field = 10; // safe

рдХреНрдпреЛрдВ:

  • рд╕рдВрдШ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рддреБрдЪреНрдЫ-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред
  • рдпрд╣ рд╕рдВрдШ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд unsafe рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд┐рдХрд╛рд▓ рджреЗрдЧрд╛ред
  • рд╕реНрдерд┐рд░ рдХреЛрдб рдореЗрдВ unused_unsafe рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рдмрд╛рдж рдореЗрдВ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред

@petrochenkov рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ "рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╕рдВрдШ рдХреЗ рдХреНрд╖реЗрддреНрд░", рдпрд╛ "рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШ"?

рдХреНрдпрд╛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрдврд╝рдиреЗ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдЖрдк рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЪреБрдирддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдиреБрдо рдФрд░ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рд╕рдВрдШ рд╣реЛрдирд╛, рдЬрд╣рд╛рдВ рд╕рдВрдШ рдореВрд▓реНрдп рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рднреЗрджрднрд╛рд╡ рд╣реИ?

рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдЬреЛ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдиреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЬрдВрдЧ рдРрд╕реЗ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛ рдпрд╛ рдореЗрдореЛрд░реА рдХреЛ рд▓реАрдХ рдХрд░рдирд╛ред рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░, рдореИрдВ рдЙрд╕ рдзреНрд╡рдирд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдареАрдХ рд╣реИред рдореИрдВ рдЗрд╕ рдпреВрдирд┐рдпрдиреЛрдВ 1.2 рдЖрд░рдПрдлрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рддрдХ рдореЗрд░реА рд░рд╛рдп рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ! рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЦреЗрддреЛрдВ рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд (рд╕рд┐рд░реНрдл рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рдкреЙрдЗрдВрдЯрд░реНрд╕) рдХреА "рдиреНрдпреВрдирддрдо" рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдореЗрдВ рдПрдХ рдЧрд▓рддреА рдереА, рд░реЗрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрдЯ рдореЗрдВ, рдФрд░ рд╣рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд (рдЬреИрд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд▓рд╛рдХрд╛рд░реЛрдВ) рдЪреАрдЬреЛрдВ рдХреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕реНрд╡рд╛рде рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдереА, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рддрд░реАрдХреЛрдВ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рднреА рдРрд╕рд╛ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд░рдЦреЛ, рдореИрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрд╕рд░реНрдЯ рдореЗрдВ unsafe рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред

@joshtriplett
"рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреНрд╖реЗрддреНрд░", рдореИрдВрдиреЗ рд╢рдмреНрджрд╛рдВрдХрди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрдврд╝рдиреЗ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдЖрдк рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЪреБрдирддреЗ рд╣реИрдВ?

рд╣рд╛рдБред рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ рдХреБрдЫ рднреА рдЕрдХреЗрд▓реЗ рдЦрддрд░рдирд╛рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд (рд╕рд┐рд░реНрдл рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рдкреЙрдЗрдВрдЯрд░реНрд╕) рдХреА "рдиреНрдпреВрдирддрдо" рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдореЗрдВ рдПрдХ рдЧрд▓рддреА рдереА, рд░реЗрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрдЯ рдореЗрдВ

рдУрд╣ред
рд╕реБрд░рдХреНрд╖рд┐рдд рд▓рд┐рдЦрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд╢рд╛рдпрдж рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдЗрд╕ рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдЖрдорддреМрд░ рдкрд░ рдЬрдм рд╣рдо рдПрдХ рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╕рдмреНрдорд┐рдЯ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╕рдмрд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗрдЯ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ рдЕрдирд┐рдЪреНрдЫреБрдХ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реА рдЪреАрдЬ рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд┐рд░ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

@nrc
рдареАрдХ рд╣реИ, рдЙрдкрд╕рдореБрдЪреНрдЪрдп рд╕реНрдкрд╖реНрдЯ рд╣реИ - "рдПрдлрдПрдлрдЖрдИ рдпреВрдирд┐рдпрдиреНрд╕", рдпрд╛ "рд╕реА рдпреВрдирд┐рдпрдиреНрд╕", рдпрд╛ "рдкреНрд░реА-рд╕реА ++ 11 рдпреВрдирд┐рдпрдиреНрд╕" - рднрд▓реЗ рд╣реА рдпрд╣ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИред рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓рдХреНрд╖реНрдп рдЗрд╕ рд╕рдмрд╕реЗрдЯ ASAP (рдпрд╣ рдЪрдХреНрд░, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ) рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ winapi рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╢реЗрд╖ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрджрд┐рдЧреНрдз рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдФрд░ "рдпреВрдирд┐рдпрдВрд╕ 1.2" рдЖрд░рдПрдлрд╕реА рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╛рд╢рд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╢реЗрд╖ рднрд╛рдЧреЛрдВ рдХреЛ 1, 2 рдпрд╛ 3 рдЪрдХреНрд░реЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд┐рдо рддрд░реНрдХ рд╣реИред
рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ

unsafe {
    u.trivially_destructible_field = value;
}

рд╕реБрд░рдХреНрд╖рд┐рдд рдкреВрд░реНрдг рд╕рдВрдШ рдХрд╛рд░реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

u = U { trivially_destructible_field: value };

рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд░реВрдк рд╕реЗ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ u рдмрд╛рдЗрдЯреНрд╕ рдХреЛ trivially_destructible_field рд╕реЗ рдмрд╛рд╣рд░ рдХреА рдУрд░ рд╕реЗ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ рдлрд╝реАрд▓реНрдб рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдиреЗ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд╛рд░рдВрдЯреА рджреА рд╣реИред

@petrochenkov рдЙрд╕ рдХрд╛ рдЪрд░рдо size_of_val(&value) == 0 , рд╣реИ рдирд╛?

рдпрджрд┐ рдкреНрд░рд╢реНрди рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╣реИ, рддреЛ рджреЛ рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рдХреЗрд╡рд▓ рд╕рдЪ рд╣реИ
"рддреБрдЪреНрдЫ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА", рдирд╣реАрдВ?

рдЗрд╕ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдпреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдореБрдЭреЗ рдмрд╣реБрдд рдЕрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред

рдлрд░рд╡рд░реА 22, 2017 14:50 рдкрд░, "рд╡рд╛рджрд┐рдо рдкреЗрдЯреНрд░реЛрдЪреЗрдирдХреЛрд╡" рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд┐рдо рддрд░реНрдХ рд╣реИред
рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ

рдЕрд╕реБрд░рдХреНрд╖рд┐рдд {
u.trivially_destructible_field = value;
}

рд╕реБрд░рдХреНрд╖рд┐рдд рдкреВрд░реНрдг рд╕рдВрдШ рдХрд╛рд░реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

u = U {trivially_destructible_field: value};

рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд░реВрдк рд╕реЗ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛
рдУрд╡рд░рд╡реЗрдЯ рдХреЗ рд╕рд╛рде trivially_destructible_field рдХреЗ рдмрд╛рд╣рд░ рдпреВ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВ,
рдлреАрд▓реНрдб рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рдмрд░рдХрд░рд╛рд░ рд░рдЦрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛрддреА рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32836#issuecomment-281660298 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AApc0lUOXLU5xNTfM5PEfEz9nutMZhXUks5rfC8UgaJpZM4IDXsj
ред

@eddyb

рдЗрд╕рдХреЗ рдЪрд░рдо рдХрд╛ рдЖрдХрд╛рд░ size_of_val (& value) == 0, рд╕рд╣реА рд╣реИ?

рд╣рд╛рдВред

@nagisa
рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреЗ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд░рд▓ рдирд┐рдпрдо рдЕрддреНрдпрдВрдд рдЕрд╕рдВрдЧрдд рдХреНрдпреЛрдВ рд╣реИред "рдХреЗрд╡рд▓ рдХреБрдЫ рдорд╛рдорд▓реЗ" рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рднреА рдПрдлрдПрдлрдЖрдИ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдмреЗрд╣рдж рдЕрд╕рдВрдЧрдд" рдПрдХ рдмрдбрд╝рд╛ overestimation рд╣реИред рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ "рдХреЗрд╡рд▓ mut рдЪрд░ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛; рднрдпрд╛рдирдХ рдЕрд╕рдВрдЧрддрд┐!", рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

@petrochenkov рдХреГрдкрдпрд╛ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

// Somebody Somewhere in some crate (v 1.0.0)
struct Peach; // trivially destructible
union Banana { pub actually: Peach }

// Somebody Else in their dependent crate
extern some crate;
fn somefn(banana: &mut Banana) {
    banana.actually = Peach;
}

рдЕрдм рдЪреВрдВрдХрд┐ рдЯреНрд░реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ, рдорд┐ред

impl Drop for Peach { fn drop(&mut self) { println!("Moi Peach!") }

рдФрд░ рдЯреЛрдХрд░рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 1.1.0 (1.0.0 AFAIK рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд) рдЬрд╛рд░реА рдХрд░реЗрдВред

рдЕрдЪрд╛рдирдХ рдорд┐рд╕реНрдЯрд░ рдПрдмреЙрдбреА рдПрд▓реНрд╕ рдХрд╛ рдХреНрд░реЗрдЯ рдЕрдм рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ:

fn somefn(banana: &mut Banana) {
    banana.actually = Peach; // ERROR: Something somethingтАж unsafe assingmentтАж somewhat somewhat trivially indestructibleтАж 
}

рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрднреА-рдХрднреА рд╕рдВрдШ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдХреЗрд╡рд▓ mut рд╕реНрдерд╛рдиреАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реВрдВ

@nagisa
рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рд╣реИ, рдореИрдВрдиреЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред

рд╕рдорд╕реНрдпрд╛ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддреА рд╣реИред рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╕рд╛ рд╣реА рдХрд░реЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╕реБрд╕рдВрдЧрддрддрд╛ рд╣реИ - рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рд╕реЗ рдмрдЪреЗрдВред рдпрд╛рдиреА "trivially-destructible" == "рдХреЛрдИ рднреА рдШрдЯрдХ рдирд┐рдХрдЯрддрдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд╕рд╛рде Drop " рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - " Copy " рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
Copy рдкреНрд░рдХрд╛рд░ Copy рдкрд┐рдЫрдбрд╝реЗ-рдЕрдиреБрдХреВрд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ Copy рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА "рддреБрдЪреНрдЫ-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА" рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрдордд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдлрдПрдлрдЖрдИ рдЖрдпрдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВред

Drop рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдпреВрдирд┐рдпрди рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ:

// Somebody Somewhere in some crate (v 1.0.0)
struct Apple; // trivially destructible
struct Pineapple { pub actually: Apple }

// Somebody Else in their dependent crate
extern some crate;
fn pineapple_to_apple(pineapple: Pineapple) -> Apple {
    pineapple.actually
}
// some crate v 1.1.0
impl Drop for Pineapple { fn drop(&mut self) { println!("Moi Pineapple!") }
fn pineapple_to_apple(pineapple: Pineapple) -> Apple {
    pineapple.actually // ERROR: can't move out of Pineapple
}

рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдбреНрд░реЙрдк рдбреНрд░реЙрдк рдЗрдВрдкреНрд▓рд╛рдВрдЯ рдХреЙрдкреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмреБрдз рдкрд░, 22 рдлрд░рд╡рд░реА, 2017 рдХреЛ рдкреНрд░рд╛рддрдГ 10:11 рдмрдЬреЗ, jethrogb рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбреНрд░реЙрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреАрдЫреЗ-рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╣реИ
рд╕рдВрдШ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛ рджреЗрдирд╛ рдирд╣реАрдВ:

// рдХрд┐рд╕реА рдХреЛ рдХрд╣реАрдВ рдХреЛрдИ рдЯреЛрдХрд░рд╛ (vред 1.0.0)
рд╕рдВрд░рдЪрдирд╛ Apple; // рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА
рд╕рдВрд░рдЪрдирд╛ рдЕрдирд╛рдирд╛рд╕ {рдкрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ: рд╕реЗрдм}

// рдХреЛрдИ рдФрд░ рдЕрдкрдиреЗ рдЖрд╢реНрд░рд┐рдд рдЯреЛрдХрд░реЗ рдореЗрдВ
рдХреБрдЫ рдЯреЛрдХрд░рд╛ рдмрд╛рд╣рд░ рдХрд░реЛ;
fn рдЕрдирд╛рдирд╛рд╕_рддреЛ_рдкрд▓ (рдЕрдирд╛рдирд╛рд╕: рдЕрдирд╛рдирд╛рд╕) -> рд╕реЗрдм {
pineapple.actually
}

// рдХреБрдЫ рдЯреЛрдХрд░рд╛ v 1.1.0
рдЕрдирд╛рдирд╛рд╕ рдХреЗ рд▓рд┐рдП рдбреНрд░реЙрдк рдЫреЛрдбрд╝рдирд╛ {fn рдбреНрд░реЙрдк (рдФрд░ рдореНрдпреБрдЯ рд╕реЗрд▓реНрдл) {рдкреНрд░рд┐рдВрдЯрд▓реЗрди! "(рдореЛрдЗ рдкрд╛рдЗрдирдПрдкреНрдкрд▓!")ред

fn рдЕрдирд╛рдирд╛рд╕_рддреЛ_рдкрд▓ (рдЕрдирд╛рдирд╛рд╕: рдЕрдирд╛рдирд╛рд╕) -> рд╕реЗрдм {
banana.actually // ERROR: рдЕрдирд╛рдирд╛рд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛
}

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/32836#issuecomment-281752949 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABxXhgbFgRNzYOsU4c6Gu1KFfwdjDHn3ks5rfHpYgaJpZM4IDXsj
ред

@jethrogb
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рдирд╣реАрдВ рдереАрдВ - Drop рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ Copy рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрдШ рдХрд╛ рдорд╛рдорд▓рд╛ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

@petrochenkov рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдПрдХ рддрд░реНрдХ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдШ рдмрдирд╛рдиреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :)

@petrochenkov рдПрдХ рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдФрд░ рд░рд╛рдд-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдиреБрднрд╡ рдкрде рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдлреАрдЪрд░ рдЧреЗрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд▓реЛрдЧ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдмреНрдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареЛрд╕ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ?

@pnkfelix
рдореИрдВрдиреЗ рдЬреЛ рдорд╛рдирд╛, рд╡рд╣ рдЗрд╕ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рд▓рд┐рдП #[feature(untagged_unions)] рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреЛрдИ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдпрд╛ рдЕрдиреНрдп рдиреМрдХрд░рд╢рд╛рд╣реА рдирд╣реАрдВ рд╣реИред
рдПрдлрдПрдлрдЖрдИ-рд╢реИрд▓реА рдХреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдорддрд▓рдм рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдЯреВрдЯрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛ред

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд░реЗрдЦрдг рдФрд░ рдкреИрдХрд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ), рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдордЬрдмреВрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@ retep998
рдкреИрдХрд┐рдВрдЧ? рдпрджрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм #[repr(packed)] рддреЛ рдпрд╣ рдЕрднреА рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рд╕рдорд░реНрдерд┐рдд рд╣реИ ( align(>1) рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд)ред

@petrochenkov #[repr(packed(N))] ред рд╡рд╛рдЗрдирдкреА рдореЗрдВ 1 рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкреИрдХрд┐рдВрдЧ рдХрд╛рдлреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдЗрди рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рдЕрдкрдиреА рдиреНрдпреВрдирддрдо рдЬрдВрдЧ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХреВрджрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдореБрдЭреЗ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ред

рдпрд╣рд╛рдБ рдЦреЗрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рд╡рд░реНрддрдорд╛рди FCP рдкреНрд░рд╕реНрддрд╛рд╡ рд╢реБрджреНрдз- Copy рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реА рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ "рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?" рдЧрддрд┐ рдХреЗ рдмрд╛рдж рд╕реЗ рдЪрд░реНрдЪрд╛ FCP рд╕рдм рдирдП RFC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @petrochenkov рд░рд╣рд╛ рд╣реИ ред

IRC рдкрд░ рдЪрд░реНрдЪрд╛ рд╕реЗ @nrc рдФрд░ @nikomatsakis , рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк рджреЛрдиреЛрдВ рдЕрдкрдиреЗ рдмрдХреНрд╕реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛;;

: рдШрдВрдЯреА: рдпрд╣ рдЕрдм рдКрдкрд░ рдХреА рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ ред : рдШрдВрдЯреА:

@petrochenkov
рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛ рдЬреЛ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдордВрдЧрд╛рдИ рдереАред (Https://internals.rust-lang.org/t/automatic-marker-trait-for-unconditionally-valid-repr-c-types/5054)

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд▓рдХреНрд╖рдг Plain рдЬреИрд╕рд╛ рдХрд┐ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдмрд┐рдХреЗрд╢рдбрд┐рдВрдЧ рдХреЗ рдЕрдзреАрди) рдХрд┐рд╕реА рднреА рдпреВрдирд┐рдпрди рдХреЛ рдХреЗрд╡рд▓ Plain рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдмрдирд╛рдпреЗрдЧрд╛, рдЬреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдЙрд╕ рдЧреБрдг рдХреЛ рд╕рдВрд╣рд┐рддрд╛рдмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ _any_ рдмрд┐рдЯ рдкреИрдЯрд░реНрди рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реНрдореГрддрд┐ рдХреЛ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХрд╛ рдЖрд░реЛрдк рд▓рдЧрд╛рдХрд░ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд░реАрдбреНрд╕ рдпреВрдмреА рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдПрдлрдПрдлрдЖрдИ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, Plain рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдзреНрд╡рдирд┐ рдХреА рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рдЧреИрд░- Plain рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ, рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рджреБрд░реНрд▓рдн рдФрд░ рдХрдард┐рди рд╣реИред рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗред

рдПрдХ рдирд╛рдорд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЕрд▓рдЧ рдЕрд╕реНрддрд┐рддреНрд╡, рджреЛ рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдпреЛрдЧреНрдп union рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ unsafe union рд╕рд╛рдордЧреНрд░реА рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд┐рд░рджрд░реНрдж рдХреЗ рд▓рд┐рдП рдЖрд░рд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рдеред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рджреВрд╕рд░реЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рд░реЛрдХ рдХреЗ рдмрд┐рдирд╛ рдпрд╛ рддреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

@ Le-jzr
рдпрд╣ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрдВрдЧ рдореЗрдВ Plain рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ + рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдиреЗ рд╕реЗ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдиреНрдЯреНрд╕ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ) рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдХрд╛рд░рдг рджреЗрд░реА рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

@petrochenkov рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХрд┐рд╕реА рднреА рдмрдВрдж рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рджреЗрд░реА рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдВ, рдмрд▓реНрдХрд┐ рдЕрдкрдиреЗ рджрдо рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ _existence_ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдВрдШ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдиреЗ рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрд╕рдВрдЧрддрд┐ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдмрдирд╛рдирд╛ рддрд╛рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдкрд╣реБрдВрдЪ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ, рдмрджрд╕реВрд░рдд рд▓рдЧрддреА рд╣реИред

рдЗрд╕рд▓рд┐рдП рдШреЛрд╖рдгрд╛ рдХреЛ unsafe union рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ, рддрд╛рдХрд┐ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдирдП рдХреАрд╡рд░реНрдб рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдмрд┐рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрд╛рдж рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд-рд╕реЗ-рдЙрдкрдпреЛрдЧ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИред

рдПрдХ рдФрд░ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд░реНрддрдорд╛рди рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ, рд╡рд╣ рд╣реИ рдЖрд░рдВрднреАрдХрд░рдгред рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдШ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╕реНрдореГрддрд┐ рдХреА рдкреВрд░реА рдЕрд╡рдзрд┐ рд╢реВрдиреНрдп рд╣реЛред рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рднреА, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдпреВрдмреА рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдХрдЯреМрддреА рдХрд░реЗрдЧрд╛ рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред

рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдХреА рдЕрд╡рдзрд┐ рдЕрдм рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред

рдЕрдм рдЬрдм рдХрд┐ FCP рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдЕрдЧрд▓рд╛ рдХрджрдо рдХреНрдпрд╛ рд╣реИ? 1.19 рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдХреЛрдИ рдЙрд╕ @rfcbot рд╕рдВрджреЗрд╢ ( рдпрд╣рд╛рдБ рд╕реНрд░реЛрдд рдХреЛрдб ) рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рдХреВрджрдиреЗ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рез.рез реп рдореЗрдВ рд▓рд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╕рд╛рдл рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдкрд░ рдХреЛрдИ рднреА? cc @joshtriplett

рдХреНрдпрд╛ NonZero enum рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди union рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Option<ManuallyDrop<&u32>> рдХреЛ рд╢реВрдиреНрдп рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ None рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред Some(ManuallyDrop::new(uninitialized::<[Vec<Foo>; 10]>())).is_some() рдХреЛ рдмрд┐рди рдмреБрд▓рд╛рдП рдореЗрдореЛрд░реА рдирд╣реАрдВ рдкрдврд╝рдиреА рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП https://crates.io/crates/arrayvec рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛) рд╣реИрдХреНрд╕ рд╣реИред

@SimonSapin
рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ RFC рдореЗрдВ рдПрдХ рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред
рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо

#![feature(untagged_unions)]

struct S {
    _a: &'static u8
}
union U {
    _a: &'static u8
}

fn main() {
    use std::mem::size_of;
    println!("struct {}", size_of::<S>());
    println!("optional struct {}", size_of::<Option<S>>());
    println!("union {}", size_of::<U>());
    println!("optional union {}", size_of::<Option<U>>());
}

рдкреНрд░рд┐рдВрдЯ

struct 8
optional struct 8
union 8
optional union 16

, рдпрд╛рдиреА рдЕрдиреБрдХреВрд▓рди рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
cc https://github.com/rust-lang/rust/issues/36394

рдпрд╣ 1.19 рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

@brson

рдпрд╣ 1.19 рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм 1.19 рдореЗрдВ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╢рд┐рдкрд┐рдВрдЧ (https://github.com/rust-lang/rust/pull/42068 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ) - рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рд╢реЗрд╖ рд╣реИ рдпрд╛ рд╣рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@jonathandturner
рдЕрднреА рднреА рдЧреИрд░- Copy рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рджреБрдирд┐рдпрд╛ рд╣реИ!
рдкреНрд░рдЧрддрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг / рдкреНрд░рд▓реЗрдЦрди RFC (https://github.com/rust-lang/rfcs/pull/1897) рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИред

рдХреНрдпрд╛ рдЕрдЧрд╕реНрдд рд╕реЗ рдЧреИрд░- Copy рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ? рдпреВрдирд┐рдпрдВрд╕ 1.2 рдЖрд░рдПрдлрд╕реА рдардк рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрд╡рдзрд┐ рдХреНрдпрд╛ рд╣реИ?)

рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ ?Sized рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ - рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП - рддреЛ https://github.com/rust-lang/rust/issues/47034 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

`` `рдЬрдВрдЧ
рдпреВрдирд┐рдпрди рдореИрдиреБрд╡рд▓рдбреНрд░реЙрдк{
рдореВрд▓реНрдп: рдЯреА
}

@ рдорд┐рдХреАрдпреНрдпреВрд╣ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ

рдореИрдВ union s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рд░рд╕реНрдЯ рдХреЛрдб рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рдВрджрд░реНрдн [рдЖрдЗрдЯрдо :: рдпреВрдирд┐рдпрдиреЛрдВ] рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ:

рдпрджрд┐ рд╡реЗ рд╕рдВрдШ рджреНрд╡рд╛рд░рд╛ рд░рдЦреЗ рдЧрдП рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИрдВ рддреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХреНрд╖реЗрддреНрд░реЛрдВ (рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд╕рдВрдЧрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ "рд▓реЗрдЖрдЙрдЯ рд╕рдВрдЧрдд" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рди рддреЛ [рдЖрдЗрдЯрдо :: рдпреВрдирд┐рдпрдиреЛрдВ] рдореЗрдВ рдФрд░ рди рд╣реА [type_system :: type_layout] рдореЗрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ ред

RFC рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдиреЗ рд╕реЗ рдореБрдЭреЗ "рд▓реЗрдЖрдЙрдЯ рд╕рдВрдЧрдд" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рдорд┐рд▓ рдкрд╛рдИ рд╣реИ, RFC 1897 рдореЗрдВ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреЗрд╡рд▓ рд╣рд╛рде рд╕реЗ рд▓рд╣рд░рд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг

RFC1444: рдпреВрдирд┐рдпрдиреЗрдВ рдХреЗрд╡рд▓ рддрдм рддрдХ рдЕрдкрдиреЗ рд╡реИрд░рд┐рдПрдВрдЯреНрд╕ рдХреЛ рдПрдХ рдпреВрдирд┐рдпрди рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдореИрдВ RFC рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ред

рдХреНрдпрд╛ _precise_ рдирд┐рдпрдо рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдиреЗ рдХрд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реБрдЖ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ (рдФрд░ рдХреНрдпрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ)?

@gnzlbg рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд▓рд┐рдП: рдЖрдк рдкреИрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЕрд╡реИрдз

рдпрджрд┐ рдЖрдк рдпреВрдирд┐рдпрдиреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд▓рд┐рдП: рдЖрдк рдкреИрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдПрдВрдо рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рд╡рд┐рднреЗрджрдХ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдРрд╕реЗ рдмреВрд▓ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд╣реА рдпрд╛ рдЧрд▓рдд рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрдорд╛рдиреНрдп рдпрд╛ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдорд╛рди рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрди рдЬреИрд╕реА рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╡реАрдирддрдо рдЖрдо рд╕рд╣рдорддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдордирдорд╛рдиреА рддреИрд░рдирд╛ рдкрдврд╝рдирд╛ рдареАрдХ рд╣реИ (# 46012)ред

рдореИрдВ рдПрдХ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЬреЛрдбрд╝реВрдВрдЧрд╛: рджреЛрдиреЛрдВ рд╕реНрд░реЛрдд рдФрд░ рд▓рдХреНрд╖реНрдп рдпреВрдирд┐рдпрди рд╡реИрд░рд┐рдПрдВрдЯ #[repr(C)] рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╡реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИрдВ рддреЛ рдЙрдирдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░ (рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА) рд╣реИрдВред

@Amanieu рдореИрдВ рд╕рд╣реА рдЦрдбрд╝рд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдо рдХрд╣реАрдВ рдирд╣реАрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ?

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЕрдкрдиреЗ рдирдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде stdsimd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЬрдм рддрдХ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдПрдХреНрд╕рдЯреНрд░реИрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдХреБрдЫ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдореЛрдВ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ:

https://github.com/rust-lang-nursery/stdsimd/blob/03cb92ddce074a5170ed5e5c5c20e5fa4e4846c3/coresimd/src/x86/test.rs#L17

AFAIK рдПрдХ рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдкрдврд╝рдирд╛ рдЙрд╕реА рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде transmute_copy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рд╕рдВрдШ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ transmute::<__m128d, [f64; 2]> рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпреВрдирд┐рдпрди рд╕рдВрд╕реНрдХрд░рдг рдпрдХреАрдирди рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИ рдЙрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрд╣ рд╕рд┐рд░реНрдл A { a }.b[idx] ред

@rkruppe рдореИрдВрдиреЗ рдЙрд╕ рд▓рд┐рдВрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ https://github.com/rust-lang-nursery/rust-clippy/issues/2361

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ :: <__ m128d i = "8">

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬрд┐рди рдирд┐рдпрдореЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡реЗ рддрдм рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЯреНрд░рд╛рдВрд╕рдореАрдЯ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ (рддреЛ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реВрдВрдЧрд╛)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдорджрдж рдорд┐рд▓рддреА рдЕрдЧрд░ рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдиреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реЛрддрд╛ (рднрд▓реЗ рд╣реА рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХреЗ рдирд┐рдпрдо рдЕрднреА рддрдХ 100% рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ) рдХреЗрд╡рд▓ "рд▓реЗрдЖрдЙрдЯ рд╕рдВрдЧрддрддрд╛" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдкрд░ред "рд▓реЗрдЖрдЙрдЯ рд╕рдВрдЧрддрддрд╛" рд╕реЗ рдЫрд▓рд╛рдВрдЧ "рдЕрдЧрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдХрд╛рд░ рд▓реЗрдЖрдЙрдЯ рд╕рдВрдЧрдд рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ" рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдЪрд╛рд░ [_copy] рдпреВрдирд┐рдпрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдЕрдзрд┐рдХ рдЖрджрд┐рдо" рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ transmute_copy рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде рд╣реИ рд╕реВрдЪрдХ as рдХрд╛рд╕реНрдЯ рдФрд░ ptr::read ред transmute рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ mem::uninitialized (рдкрджрд╛рд╡рдирдд) рдпрд╛ MaybeUninitialized (рдПрдХ рд╕рдВрдШ) рдпрд╛ рдРрд╕рд╛ рд╣реА рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкреНрд░рднрд╛рд╡рдХрд╛рд░рд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдиреАрдЪреЗ рдЖ рдЬрд╛рддрд╛ рд╣реИ- рдзреВрд░реНрдд рдореЗрдордХреАред рдореБрдЦреНрдп рдХрд╛рд░рдг рдЬреЛ рдореИрдВрдиреЗ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреБрд░рд╛рдиреЗ рдФрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЬреЛрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рд▓реЗрдЦрди рдФрд░ рд▓реЛрдХрдХрдерд╛рдУрдВ рдХрд╛ рдЬреНрдЮрд╛рди рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛, рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ (рдФрд░ рдЬреЛ рдПрдХ рдпреБрдХреНрддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛), рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдмреА рдЕрдиреБрдХреНрд░рдо рд╣реИрдВред

рд╕реБрдзрд╛рд░: рдЯреНрд░рд╛рдВрд╕рдореАрдЯ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб рд╕реНрдЯреЛрд░реЗрдЬ (рдЖрдВрддрд░рд┐рдХ, рдпрд╛ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ рдЕрдиреНрдпрдерд╛) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рддрд░рдл рджрдХреНрд╖рддрд╛, рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрдЫреВрддрд╛, рд╢рд░реНрдордирд╛рдХ рдЯрд╛рдЗрдкреЛрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ):

fn transmute<T, U>(x: T) -> U {
    assert!(size_of::<T>() == size_of::<U>());
    let mut bytes = [0u8; size_of::<U>()];
    ptr::write(bytes.as_mut_ptr() as *mut T, x);
    mem::forget(x);
    ptr::read(bytes.as_ptr() as *const U)
}

рд╕рдВрдЪрд╛рд░рдг рдХрд╛ рдПрдХрдорд╛рддреНрд░ "рдЬрд╛рджреБрдИ" рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрд╛рдзреНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн рдФрд░ рдпреВрдирд┐рдпрдВрд╕ 1.2 рдЖрд░рдПрдлрд╕реА рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдирд┐рдкрдЯрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрд╢рдп рдпрд╣ рдерд╛ рдХрд┐ " repr(C) рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рддреГрддреАрдп-рдкрдХреНрд╖ ABI рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВ, repr(Rust) рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рд╕рдВрдЧрддрддрд╛ рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ)"ред

рдХреНрдпрд╛ рдмреВрдВрджреЛрдВ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдбреНрд░реЙрдк рдЪреЗрдХ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдирд╛ рджреЗрд░ рд╣реЛ рдЧрдИ рд╣реИ?

рдореВрд▓ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ ManuallyDrop рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЬреЛрд╕реЗрдлрд┐рди рдЕрд╕реНрд╡рд╕реНрде рд╣реЛ рдЧрдИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ (рдмрд▓реНрдХрд┐

рдПрдХ рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг https://play.rust-lang.org/?gist=607e2dfbd51f4062b9dc93d149815695&version=nightly рдкрд░ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ Pin<'a, T> , рдПрдХ рд╡рд┐рдзрд┐ pin(&'a self) -> &'a T рдЬрд┐рд╕рдХреА рд╕реБрд░рдХреНрд╖рд╛ " pin.pin() рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж" рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдпрджрд┐ рдкрд┐рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХрднреА рднреА рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдкрд┐рди рдХрд╛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реЛрдЧрд╛ тАЭред

рдЗрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рд░реБрд╕реНрдд рджреНрд╡рд╛рд░рд╛ #[allow(unions_with_drop_fields)] рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ ManuallyDrop https://doc.rust-lang.org/src/core/mem.rs.html#949 рддрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рдпрджрд┐ рдбреНрд░рд╛рдк рдЪреЗрдХрд░ рдбреНрд░реЙрдк рдлрд╝реАрд▓реНрдб рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдбреНрд░реЙрдк рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЬрдВрдЧрд▓реА рдореЗрдВ рдХреЛрдИ рднреА рдХреЛрдб рдореМрдЬреВрджрд╛ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

IRC рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк: https://botbot.me/mozilla/rust-lang/2018-02-01/?msg=96386869&page=3

рдЬреЛрд╕реЗрдлрд┐рди рдореБрджреНрджрд╛: https://github.com/asajeffrey/josephine/issues/52

cc: @nox @eddyb @pnkfelix

рдореВрд▓ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдирд▓реАрдбреНрд░реЙрдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЬреЛрд╕реЗрдлрд┐рди рдЕрд╕реНрд╡рд╕реНрде рд╣реЛ рдЧрдИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ (рдмрд▓реНрдХрд┐ рд╢реВрдиреНрдп рд░реВрдк рд╕реЗ) рдкрд░рдорд╛-рдЙрдзрд╛рд░ рдореВрд▓реНрдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреА рдереА, рдЬрд┐рдирдХреЗ рдмреИрдХрд┐рдВрдЧ рд╕реНрдЯреЛрд░ рдХреЛ рдкрд╣рд▓реЗ рдмрд┐рдирд╛ рдЙрдирдХреЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЪрд▓рд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред рдЬрдВрдЧ рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, std::mem::forget рдХреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрджрд┐ рдбреНрд░рд╛рдк рдЪреЗрдХрд░ рдбреНрд░реЙрдк рдлрд╝реАрд▓реНрдб рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдбреНрд░реЙрдк рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЬрдВрдЧрд▓реА рдореЗрдВ рдХреЛрдИ рднреА рдХреЛрдб рдореМрдЬреВрджрд╛ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдпреВрдирд┐рдпрдиреЗрдВ рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рд╕рдВрдШ рдХрд╛ рдХреМрди рд╕рд╛ рдХреНрд╖реЗрддреНрд░ рдорд╛рдиреНрдп рд╣реИред рд╕рдВрдШ рдирд╣реАрдВ рд╣реЛ Drop impl; рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреЛрдИ рдЗрдореНрдкреНрд▓рд╛рдиреНрдЯ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХреЛ Drop рд╕рд╛рде рдпреВрдирд┐рдпрди рдлреАрд▓реНрдб рдорд╛рдиреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрд╣рд╛рдВ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрднреА рднреА рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрддрд╛рд╡рдиреА-рдмрд╛рдп-рдбрд┐рдлреЙрд▓реНрдЯ рд▓рд┐рдВрдЯ рдХреЗ рдмрд┐рдирд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Drop рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдПрдХ рддреНрд░реБрдЯрд┐-рдмрд╛рдп-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд┐рдВрдЯ рдирд╣реАрдВред unions_with_drop_fields рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЙрдлрд╝, "рдХрд░реАрдм рдФрд░ рдЯрд┐рдкреНрдкрдгреА" рд╣рд┐рдЯ рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛ред

@joshtriplett рд╣рд╛рдБ, рд░рд╕реНрдЯ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЪрд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖ (1.19 рд╕реЗ рдкрд╣рд▓реЗ) рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд░рдорд┐рдЯ-рдЙрдзрд╛рд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЙрдирдХреА рд╕реНрдореГрддрд┐ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рднрд╛рдЧ рдЧрдпрд╛ред рдпрд╣ mem::forget рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ perma-рдЙрдзрд╛рд░ рдореВрд▓реНрдп рдкрд░ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЬреЛрдлрд┐рди рдкрд░ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреНрд░реЙрдк рдЪреЗрдХрд░ unions_with_drop_fields рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдареАрдХ рд╣реЛрдЧрд╛ рдпрджрд┐ allow(unions_with_drop_fields) рдХреЛ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, AFAICT, рдпрд╣ рд╕рд┐рд░реНрдл deny(unsafe_code) allow(unions_with_drop_fields) рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@asajeffrey рдореИрдВ рдЕрднреА рднреА Pin рдЪреАрдЬрд╝ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ... рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ "рдХрд╛рдо" рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ fn pin(&'a Pin<'a, T>) -> &'a T рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдм рддрдХ рдЬреАрд╡рдирдХрд╛рд▓ 'a рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдЬреАрд╡рди рдЕрдзрд┐рдХ рдЖрдХреНрд░рд╛рдордХ рд╣реИред

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд▓реЛрдХрди рд╣реИ! рдореБрдЭреЗ рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереАред рдореЗрд░реА рдЖрдВрдд рдХреА рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ "рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ" рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдЪрд▓рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ "рдЕрдиреБрдмрдВрдз" рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html рд▓реАрдХ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

IMO рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдпрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред ManuallyDrop рдореМрдЬреВрджрд╛ (рдЬреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЗ рд╕рд╛рде Drop рдмрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛, рдФрд░ рдЕрдм рд╣рдо рдЙрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

ManuallyDrop рдХрд╛ рдЬреЛрдбрд╝ рдореВрд▓ рд░реВрдк рд╕реЗ рд░рд╕реНрдЯ рдХреЗ рдЙрд╕ рдиреАрдЪ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдорд╛рд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реА рдЬрдЧрд╣ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдЬреЛ рдореБрдЭреЗ рд╕рд░реНрдХреБрд▓рд░ рд░реАрдЬрдирд┐рдВрдЧ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ ManuallyDrop рдиреЗ Pin::pin рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рд╣реИ, рддреЛ рдХреНрдпрд╛ Pin::pin рдЕрдирд▓реЙрдЙрдВрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛? рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рд╣рд░ рдЧрд╛рд░рдВрдЯреА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЧрд▓рддреА рд╕реЗ рд╕рд╣реА рд╕рдордп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рджреЛрдзрд╛рд░реА рддрд▓рд╡рд╛рд░ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрд╛рд░рдВрдЯреА рдЬреЛ рд╣рдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдЧрд╛рд░рдВрдЯреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдмрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдореМрдЬреВрджрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб (рдЪреБрдкрдЪрд╛рдк crates.io рдкрд░ рдХрд╣реАрдВ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдмрд┐рдирд╛ рдмреИрдареЗ) рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╕рдХреНрд╖рдо рдЦреЛрдЬ рддреЛ (рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд╛рдорд▓реЗ рдпрд╣рд╛рдБ рдерд╛)ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдмреЛрдзрдЧрдореНрдп рд╣реИ рдХрд┐ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЧреИрд░-рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рднреА рдЬреАрд╡рдирдХрд╛рд▓ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ? рдХреЗрд╡рд▓ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рд╛рде, рдРрд╕реЗ рдЬреАрд╡рдирдХрд╛рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рди рддреЛ рджреВрд╕рд░реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдПрдирдПрд▓рдПрд▓ рдХреЛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдмрдирд╛рддрд╛ рд╣реИ? рдореБрдЭреЗ рдЖрд╢рд╛ рдирд╣реАрдВ рд╣реИ!

рдЕрдЧрд░ ManuallyDrop рдиреЗ Pin :: pin рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рд╣реИ, рддреЛ рдХреНрдпрд╛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ Pin :: pin unsound? рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

unsafe рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред рддреЛ рдЗрд╕ Pin рдЯреНрд░рд┐рдХ рд╕рд╛рдЙрдВрдб рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ, рдЖрдк рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб unsound рдШреЛрд╖рдгрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЕрдЧрд░ рд╣рдо ManuallyDrop рдареАрдХ рд╣реИ, рддреЛ рдзреНрд╡рдирд┐ рд╣реЛрдЧреА ред

рд╣рдордиреЗ рдЬреЛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдЬреАрдПрд╕ рдХреЗ рд╕рд╛рде рдЬрдВрдЧ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рддрд░реАрдХрд╛ рд╣реИред рдЬреЛ рдореИрдВ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдереА, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рдореИрдВ Drop рд╕рд╛рде рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдВ @Asajeffrey рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ Drop рдлрд╝реАрд▓реНрдб, рдФрд░ рдЬрдм рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдорд╕реНрд╕рд╛ рдЬреЛрд╕реЗрдлрд┐рди рдХреЛ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдХрд░ рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛ рдЕрдЧрд░ рдХреЛрдИ рдпрд╣ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ ManuallyDrop рдмрд┐рдирд╛ рднреА рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореИрдВ рдЬреЛ рдХрд╣рдирд╛ рдЪрд╛рд╣ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдирд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдереА

рдореБрдЭреЗ рдЗрд╕ рдЪрд╛рд▓ рдХрд╛ рдХреЛрдИ рд╕рдВрдХреЗрдд рдХрднреА рднреА "рдбрд┐рдЬрд╝рд╛рдЗрди" рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рджреБрд░реНрдШрдЯрдирд╛ рдХрд╣рдирд╛ рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╣реИред

рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП

рдореБрдЭреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рд┐рд░реНрдл рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рд╡рдирд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ "рдЦреБрд╢рд╣рд╛рд▓ рджреБрд░реНрдШрдЯрдирд╛" рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ - рдЕрдЧрд░ рд╣рдо рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА unsafe рдХреЛрдб рдЗрд╕ рдЧрд╛рд░рдВрдЯреА рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ ManuallyDrop рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рдПрдХ рдЯреНрд░реЗрдб-рдСрдл рд╣реИ, рдЬреЛ рд▓реАрдХреЗрдкреЛрдХрд▓рд┐рдкреНрд╕рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо рдЕрдкрдирд╛ рдХреЗрдХ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рднреА рд╣реИ, (рд╣рдо рджреЛрдиреЛрдВ Rc рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рдФрд░ drop - рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рд╕реНрдХреЛрдк рдЖрдзрд╛рд░рд┐рдд рдереНрд░реЗрдб; рд╣рдо рджреЛрдиреЛрдВ ManuallyDrop рдФрд░ Pin ) рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рдпрд╣рд╛рдВ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрд╛рд░рдВрдЯреА рдХреЛ рд╕рдЯреАрдХ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ " ManuallyDrop рдареАрдХ рд╣реИ" рдЪреАрдЬреЛрдВ рдХреА рдУрд░ рдЕрдзрд┐рдХ рдЭреБрдХрд╛рд╡ рджреЗрддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА unsafe рдХреЛрдб рдЗрд╕ рдЧрд╛рд░рдВрдЯреА рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ ManuallyDrop рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рдПрдХ рдЯреНрд░реЗрдб-рдСрдл рд╣реИ, рдЬреЛ рд▓реАрдХреЗрдкреЛрдХрд▓рд┐рдкреНрд╕рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо рдЕрдкрдирд╛ рдХреЗрдХ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рднреА рд╣реИ, (рд╣рдо рджреЛрдиреЛрдВ Rc рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рдФрд░ drop - рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рд╕реНрдХреЛрдк рдЖрдзрд╛рд░рд┐рдд рдереНрд░реЗрдб; рд╣рдо рджреЛрдиреЛрдВ ManuallyDrop рдФрд░ Pin ) рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред

рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ, рдореИрдВ рджрд┐рд▓ рд╕реЗ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрдд рдореЗрдВ рдЕрдкрд░рд┐рд╖реНрдХреГрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд drop -рднреЛрдЬреА рд╕реНрдХреЙрдкреНрдб рдереНрд░реЗрдб API рд╡рд╛рдкрд╕ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрд▓рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ ManuallyDrop рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдбреНрд░реЙрдкрдХ рдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ (рдФрд░ Drop рдлрд╝реАрд▓реНрдб рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛) рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реИред (рдпрд╣ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорд╛рддреНрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдбреНрд░реЙрдкрдХ рд╕реНрд╡реАрдХрд╛рд░ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред)

рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдмрд┐рдирд╛ рдореИрдиреБрдЕрд▓реА рдореИрдирдбреНрд░реЙрдк рдХреЗ рднреА рдмреЗрдХрд╛рд░ рдерд╛ред

рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ: ManuallyDrop рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ union рдЬрдВрдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

pub mod manually_drop {
    use std::mem;
    use std::ptr;
    use std::marker::PhantomData;

    pub struct ManuallyDrop<T> {
        data: [u8; 32],
        phantom: PhantomData<T>,
    }

    impl<T> ManuallyDrop<T> {
        pub fn new(x: T) -> ManuallyDrop<T> {
            assert!(mem::size_of::<T>() <= 32);
            let mut data = [0u8; 32];
            unsafe {
                ptr::copy(&x as *const _ as *const u8, &mut data[0] as *mut _, mem::size_of::<T>());
            }
            mem::forget(x);
            ManuallyDrop { data, phantom: PhantomData }
        }

        pub fn deref(&self) -> &T {
            unsafe {
                &*(&self.data as *const _ as *const T)
            }
        }
    }
}

(рд╣рд╛рдБ, рд╕рдВрд░реЗрдЦрдг рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдмрдЫрдбрд╝реЛрдВ рдХреА рдмрд▓рд┐ рджреЗрдХрд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)
рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди Pin : https://play.rust-lang.org/?gist=fe1d841cedb13d45add032b4aae6321e&version=nightly

рдКрдкрд░ рдХреА рджреЛ рдзрд╛рд░ рд╡рд╛рд▓реА рддрд▓рд╡рд╛рд░ рд╕реЗ рдореЗрд░рд╛ рдЕрднрд┐рдкреНрд░рд╛рдп рд╣реИ - рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ, рдореЗрд░рд╛ ManuallyDrop рдЙрди рд╕рднреА рдирд┐рдпрдореЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдмрд╛рд╣рд░ рд░рдЦреЗ рд╣реИрдВред рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд╕рдВрдЧрдд рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рджреЛ рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ - ManuallyDrop рдФрд░ Pin ред рдХреМрди "рд╕рд╣реА" рд╣реИ? рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ Pin рдЧрд╛рд░рдВрдЯреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ "рдЧрд▓рдд" рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдирд┐рд░реНрдгрдп рдХреЙрд▓ рд╣реИ, рди рдХрд┐ рдПрдХ рдкреНрд░рдорд╛рдгред

рдЕрдм рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╣рдорд╛рд░реЗ рдкрд┐рдирд┐рдВрдЧ рд╕рд╛рдорд╛рди рдХреЗ рдХреБрдЫ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, Pin::pin &'this mut Pin<'this, T> Pin::pin рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ ManuallyDrop рд▓рд┐рдП рдпрд╣ рдЕрдиреБрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ DerefMut рдирд┐рд╣рд┐рдд рд╣реЛ, рд╕рд╣реА ?

рдпрд╣рд╛рдБ рдПрдХ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ @RalfJung рдХрд╛ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ) рдЕрднреА рднреА Pin рд╕рд╛рде &mut - pin рдкрджреНрдзрддрд┐ рд╕реЗ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред

https://play.rust-lang.org/?gist=5057570b54952e245fa463f8d7719663&version=nightly

рдпрд╣ рдЖрдкрдХреЗ ManuallyDrop рдХреЗ рд▓рд┐рдП рдЕрдиреБрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдПрдХ DerefMut рдирд┐рд╣рд┐рдд рд╣реИ, рд╣реИ рдирд╛?

рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ deref_mut рдмрд╕ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдПрд▓рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдореИрдирд▓реАрдбреНрд░реЙрдк рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдбреНрд░реЙрдкрдХ рдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдпрд╣ (рдФрд░ рдбреНрд░реЙрдк рдлреАрд▓реНрдб рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдпреВрдирд┐рдпрдиреЛрдВ) рдореЗрдВ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реИред (рдпрд╣ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорд╛рддреНрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдбреНрд░реЙрдкрдХ рд╕реНрд╡реАрдХрд╛рд░ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред)

рдЖрд╣, рдореИрдВ рдЪреВрдХ рдЧрдпрд╛ рдерд╛ рдХрд┐; рдЙрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдлрд╝ рдХрд░рдирд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд░рд╣рддрд╛ рд╣реИ:

    unsafe impl<#[may_dangle] T> Drop for ManuallyDrop<T> {
        fn drop(&mut self) {}
    }

рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдореИрдВ #[may_dangle] Rust рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред рддреЛ, рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рд╣рдореЗрдВ рдХреБрдЫ рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ - рдмрд╕ рдпрд╣ рдХрд╣ рд░рд╣рд╛ рд╣реИ рдХрд┐ "рдХреБрдЫ рдХреЛрдб рдореМрдЬреВрдж рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдзреНрд╡рдирд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрд╕рдВрдЧрдд рд╣реИ" рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рдХреЙрд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ рдХреБрдЫ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдзреНрд╡рдирд┐ рд╣реИ рддреЛ рдмрд╣реБрдд рдЕрд╕рдВрднрд╡ рд╣реИред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ "рдЖрдХрд╕реНрдорд┐рдХ рдЧрд╛рд░рдВрдЯреА" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмреЗрдЪреИрдиреА рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд░рд╕реНрдЯ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рддрд╛рд░-рддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕ рдкрдХрдбрд╝ рдХреЛ рдПрдХ рд╕рд╛рде рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реАрдХ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдореГрдд рдбреЗрдЯрд╛ (рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдореЗрдВ рдПрдХ рдЖрдо рд╕рдорд╕реНрдпрд╛) рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░реЙрдкрдХ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдХреЗ рд▓рд┐рдП рддрд░реНрдХ Pin рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИ "рдпрд╣рд╛рдБ, рдЬрдВрдЧ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХреБрдЫ рддрдВрддреНрд░, рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ perma-рдЙрдзрд╛рд░ рдбреЗрдЯрд╛ рд▓реАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛" - рдпрд╣ рдмрд▓реНрдХрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ "рд╣рдордиреЗ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреА рд╣реИ рдФрд░ рд╣рдо рдкреЗрдорд╛-рдЙрдзрд╛рд░ рдбреЗрдЯрд╛ рд▓реАрдХ рдирд╣реАрдВ рдХрд░ рдкрд╛рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ"ред рдзреНрд╡рдирд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред EDIT: рдпрд╣ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдбреНрд░реЙрдкрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдореБрдЭреЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдмреБрд░рд╛ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рдХреАрдбрд╝реЗ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ perma-рдЙрдзрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд drop рд╕рд╛рде рдмрд╛рдзрд╛рдУрдВ рдкрд░ рд╣реИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ "рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ" рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдорд╛рдорд▓реЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдЕрдм, рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдорд╛рди рдмрд╛рддреЗрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ - рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдЭрд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рд╕рд╣реА рдПрдкреАрдЖрдИ рдЪреБрдирддреЗ рд╣реИрдВред рдмрд╣рд░рд╣рд╛рд▓, рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╕рдорд░реНрдерди (рдЕрдкреЗрдХреНрд╖рд┐рдд UnsafeCell ), рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдБ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╣реИ рдХрд┐ рдЗрдВрдЯреАрд░рд┐рдпрд░ рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдзреНрд╡рдирд┐ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд╕рд╛рде рдзреНрд╡рдирд┐ рдирд╣реАрдВ рд╣реИред рдПрдХ рдФрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯреАрд░рд┐рдпрд░ рдореНрдпреВрдЯреЗрдмрд┐рд▓рд┐рдЯреА рд╢реБрд░реВ рд╕реЗ рд╣реА рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд▓рдХреНрд╖реНрдп рдерд╛ (рдпрд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╕реЗ - рдпрд╣ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдореЗрд░реЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ), рдЬреЛ рдХрд┐ "рдкрд░рдо-рдЙрдзрд╛рд░ рд▓реАрдХреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ" рд▓реАрдХ рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рд╕рд╛рдЭрд╛рдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдХрд╣рд╛рдиреА рд╣реИ , рдЬреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╣реИ , рд▓реЗрдХрд┐рди рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн 'рдПрдкреАрдЖрдИ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдкреНрд░рдХрд╛рд░ ", рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╕рдордЧреНрд░ рдЪрд┐рддреНрд░ рд╣реИред рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рд╕рд╛рдЭрд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рде рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реБрд╕рдВрдЧрдд рддрд╕реНрд╡реАрд░ рд╣реЛ рдЬреЛ рдореБрдЭреЗ рдЕрднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдордЬреЗрджрд╛рд░ рд╣реИрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдЙрда рдЧрдпрд╛! рдпрд╣рд╛рдБ рджреЛ рдореБрджреНрджреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╣рдорд▓рд╛рд╡рд░, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреНрд░реЙрдкрдХ), рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдбрд╛рд▓реВрдБрдЧрд╛ ...

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ : рд╣рд╛рдВ, рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рд╣реИред рдЬрдВрдЧ + рдПрд╕рдЯреАрдбреА рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдХреНрд░рдордгрдХрд╛рд░реА I рдХрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рднрд░реЛрд╕реЗрдордВрдж-рдЧрд╛рд░рдВрдЯреА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп L1 рдФрд░ L2 , рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрд╕рдВрдЧрдд I1 рдФрд░ I2 , рдЬреИрд╕реЗ рдХрд┐ Rust + L1 рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдЬрдВрдЧ + L2 рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдВрдЧ + L1 + L2 рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, L1 ManuallyDrop рдФрд░ L2 Josephine , рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ ManuallyDrop рдЕрдм рдЬреАрддрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред std , рдЬреЛ рдХрд┐ рдЬреЛрд╕рдлреАрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд┐рдЫрдбрд╝реА рдЕрдиреБрдХреВрд▓рддрд╛ рдХреА рдХрдореА рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html рдкрд░ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рджреЗрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред" рдЗрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ: ... "рдЕрд░реНрдерд╛рдд, рдпрд╣ рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ (рд╕рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП C, C [P] рдЧрд▓рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛) рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ (рдЪреВрдВрдХрд┐ Rust + std рдХрд╛ v1.20 рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ v1.18 рд╕реЗ рд╕рдВрджрд░реНрдн)ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдкрд┐рдирд┐рдВрдЧ рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1.20 рд╕реЗ рдкрд╣рд▓реЗ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмрд╛рдзрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рдерд╛ рд╕реА рд╕реЗрдВрдЯ рд╕реА [рдкрд┐рдирд┐рдВрдЧ] рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рд┐рд░реНрдл рдмреИрд░рдХ-рд░реВрдо рд▓реЙрдпрд░рд┐рдВрдЧ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЪрд░реНрдЪрд╛рдПрдВ рд╣реИрдВред

рдЕрдЧрд░ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдирд┐рдВрдЧ рдиреЗ рдЖрдХрд╕реНрдорд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдЧрд▓рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рд╣реИред

рдЦрд╝рд╛рд╕ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрд╕рдВрдЧрдард┐рдд рдпреВрдирд┐рдпрдиреЛрдВ (рдФрд░ рдЗрд╕рд▓рд┐рдП ManuallyDrop ) рдиреЗ рдбреНрд░реЙрдк рдЪреЗрдХрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдореЗрдВ рдерд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ManualDrop

unsafe impl<#[may_dangle] T> Drop for ManuallyDrop<T> { ... }

рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдорддрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВ :) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк may_dangle рдереНрд░реЗрдб рдореЗрдВ рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реИ https://github.com/rust-lang/rust/issues/ рдкрд░ 34761 # рдЬрд╛рд░реАрдХрд░рдг -362375924

@RalfJung рдЖрдкрдХрд╛ рдХреЛрдб рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХреЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ data рд▓рд┐рдП рд░рди-рдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ T , рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ [u8; N] ред may_dangle рдХрд╛ рд╕рдВрдмрдВрдз рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╣реИ?

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html рдкрд░ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рджреЗрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред" рдЗрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ: ... "рдпрд╣ рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ

рдЖрд╣, рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдореВрд▓ рд╕реНрдХреВрдкреНрдб рдереНрд░реЗрдбреНрд╕ рдХреЛ рдзреНрд╡рдирд┐ рджреЗрдЧрд╛ред рд╕рд╛рд░реНрдердХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ (рдХрдо рд╕реЗ рдХрдо) рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд╕реЗрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрдирд╡рд┐рдпрд░реНрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдХреНрд╖рдкрд╛рддреА рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рд░рд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред ;)

рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдЗрд╕ рдкреГрд╖реНрда рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕реНрд╡реАрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВ; рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдорд╛ рдХреНрдпрд╛ рд╣реЛрдЧреА - рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╡рд╣ рдХрд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╕реАрдорд╛рдПрдВ рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдЙрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╣рд╛рд▓рд┐рдпрд╛ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП https://github.com/nikomatsakis/rust-memory-model/issues/44 рджреЗрдЦреЗрдВ: &mut T mem::size_of::<T>() == 0 рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдиреЗрддреГрддреНрд╡ рди рдХрд░реЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ, рдФрд░ рдлрд┐рд░ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╡реИрдз рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдЗрд╕рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдЕрдиреБрд╢рд╛рд╕рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЪреАрдЬреЛрдВ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рд╕реЗ рдЙрд╕ рдЕрдиреБрд╢рд╛рд╕рди рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИред

рдЕрдЧрд░ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдирд┐рдВрдЧ рдиреЗ рдЖрдХрд╕реНрдорд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдЧрд▓рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рд╣реИред

рдУрд╣, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдмрдбрд╝реА рдЪреЗрддрд╛рд╡рдиреА https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html рдкрд░ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП "рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡реНрдпрдХреНрддрд┐ рдЬрдВрдЧ рдЦрд╛рдП + рд▓рд┐рдмрд╛рд╕ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ" рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рдХреБрдЫ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ рдЬрд┐рди рдкрд░ рдЖрдк рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рд╣рд╛рдБ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА "рд╢реБрджреНрдзрддрд╛" рдХреЗ рд╕рдВрджрд░реНрднрдЧрдд рдЕрд╡рд╣реЗрд▓рдирд╛ рд╕реЗ рдкреНрдпрд╛рд░ рд╣реИ, рдореБрдЦреНрдпрддрдГ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдЕрд╡рд▓реЛрдХрди рд╢рдХреНрддрд┐ рдХреЛ рднрдВрдЧреБрд░ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд╡рдЬреНрдЮрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЦреБрд╢ рд╣реВрдБред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВ рдкреВрдЫреВрдВрдЧрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреГрдкрдпрд╛ рд╣рдо рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХреБрдЫ рдЭрд╛рд▓рд░ рд╡рд╛рд▓рд╛ рдХрдорд░рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рднрд░реЛрд╕реЗрдордВрдж-рдЧрд╛рд░рдВрдЯреА рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рджреЛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЛрдб рдЖрд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреА рдХреЛ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдЬреА рдХрд╛ рдЕрд░реНрде рд╣реИ рдЖрд░)ред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрд░ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдФрд░ рдЬреА рдХреЛ рдХрдордЬреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрдЧрд╣ рд╣реИред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╕ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ (рдпрд╛рдиреА рдЖрд░ = рдЬреА) рддреЛ рд╣рдо рдлрдВрд╕ рдЧрдП рд╣реИрдВ рдХрднреА рднреА рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ!

рдирд┐рд░рдВрддрд░ рдЬрд╛рдБрдЪ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рдпреВрдирд┐рдпрди рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ: (cc @solson @ oli-obk)

union Transmute<T, U> { from: T, to: U }

const SILLY: () = unsafe {
    (Transmute::<usize, Box<String>> { from: 1 }.to, ()).1
};

fn main() {
    SILLY
}

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдорд╛рд░реА рдореВрд▓реНрдпрд╛рдВрдХрди рддреНрд░реБрдЯрд┐ "рдиреЙрди-рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ fn std::ptr::drop_in_place::<(std::boxed::Box<std::string::String>, ())> - shim(Some((std::boxed::Box<std::string::String>, ()))) " рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП .to рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд▓рдкреВрд░реНрд╡рдХ рдкрд░реАрдХреНрд╖рдХ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

const fn id<T>(x: T) -> T { x }

const SILLY: () = unsafe {
    (id(Transmute::<usize, Box<String>> { from: 1 }.to), ()).1
};

"рд╡рд┐рдирд╛рд╢рдХреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ"ред

рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдпрд╣рд╛рдВ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ restrict рдХреЙрд▓):
https://github.com/rust-lang/rust/blob/5e4603f99066eaf2c1cf19ac3afbac9057b1e177/src/librustc_mir/transform/qualify_consts.rs#L557

# 41073 рдХреЗ рдмреЗрд╣рддрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдерд╛ рдХрд┐ рдЬрдм рд╕рдВрдШреЛрдВ рдХреЗ рдЙрдк-рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рднрд╛рдЧ рдЖрддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдереИрддрд┐рдХрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рд╣реИрдВред рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ Drop рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╢рд╛рд╕рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╣реИ, рдФрд░ ManuallyDrop рдЕрд▓рдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдПрдХ рд▓рдВрдЧ-рдЖрдЗрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ)? рдЬреЛ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, ManuallyDrop рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ Drop рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдкреНрд░реЗрд░рдгрд╛ рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЦрд╛рд╕ рдорд╛рдорд▓рд╛ рд╣реИред

рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ "рдиреЛ рдбреНрд░реЙрдк" рдЧреБрдг рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рд╣рдо рддрдм рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рдВрдШ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдирддрд╛ рд╣реИ рдпрджрд┐ рд╣рд░ рдХреНрд╖реЗрддреНрд░ Copy рдпрд╛ ManuallyDrop<T> ред рдпреВрдирд┐рдпрди рдлреАрд▓реНрдб рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдбреНрд░рд╛рдкрд┐рдВрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕рднреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдЗрдб-рд╕реНрдЯреЗрдк рдХрд░ рджреЗрдЧрд╛ (рдЬрд╣рд╛рдБ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдлреБрдЯрдЧрдгреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реЛрдЧрд╛), рдФрд░ ManuallyDrop рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдорд╛рд░реНрдХрд░ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЗрдВ Drop рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ Drop рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред" рдЕрдЪреНрдЫреЗред)


рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдЕрдирд▓рд┐рд╕реНрдЯреЗрдб рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ, рди рд╣реА RFC --- рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ , рдЬреЛ рд╕рд┐рдВрдЧрд▓-рд╡реЗрд░рд┐рдПрдВрдЯ рдпреВрдирд┐рдпрдиреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдпрд╣ рд▓реЗрдЖрдЙрдЯ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдПрдХ рдмрд╛рд░ рдкрддрд▓реЗ-рдкреЙрдЗрдВрдЯрд░ рдбреАрдПрд╕рдЯреА рдЪрд┐рддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ) рдЬреЛ рдХрд┐ рдПрдХ рдПрдХрд▓-рд╡реЗрд░рд┐рдПрдВрдЯ рдпреВрдирд┐рдпрди рдХреЛ рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ "рдорд╛рдиреНрдп" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕реЗ рдЧрд┐рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐рд╕реА рднреА рд╡рд┐рд╖рдо рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдпрд╛ рддреЛ)ред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпреВрдирд┐рдпрди рдореЗрдВ рдХрднреА-рдХрднреА рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдЯрдХрд░рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ "рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ" рд╣реИ (IIRC @joshtriplett рдПрдХ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╕рднреА рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИ): рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдПрдХ рдпреВрдирд┐рдпрди рдХреЗ рд▓рд┐рдП 3 рд╡реЗрд░рд┐рдПрдВрдЯ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдж рдореЗрдВ рдФрд░ рд╡реЗрд░рд┐рдПрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ-рд╕рдВрдЧрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд╕рдВрдШ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рди рд╣реЛ)ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпреВрдирд┐рдпрди рдбреЗрдЯрд╛ рдХреЛ рдирд╣реАрдВ рдЫреВрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЯреИрдЧ (рдХрд╣реАрдВ рдФрд░ рдмреИрдареЗ) рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдкрддрд╛ рд╣реИ, рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ!

рдпрд╣ рдЬрд╛рдБрдЪ рдЕрдзрд┐рдХ рд╕реНрдорд╛рд░реНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдЯреЛрдХрд░реЗ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдпрд╣ рд╡рд┐рдзреЗрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрдВ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд░ рдмрд╛рдзреНрдп рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рд▓рдХреНрд╖рдг рдирд╣реАрдВ рд╣реИред
рдЖрдк рдЗрд╕реЗ std::mem::needs_drop рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ rustc рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред

@eddyb needs_drop рдЦрд╛рддреЗ рдореЗрдВ рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЛ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдпрд╣ рдЦреБрд╢реА рд╕реЗ рдЕрдиреНрдп рдХреГрддрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ Drop рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ? рдпрд╣рд╛рдВ рд▓рдХреНрд╖реНрдп рдПрдХ рдРрд╕рд╛ рдЪреЗрдХ рд╣реИ рдЬреЛ рд╕реЗрдорд░-рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдХрднреА рдирд╣реАрдВ рдЯреВрдЯреЗрдЧрд╛, рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ impl Drop рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдХреЗрд╡рд▓ рдирд┐рдЬреА рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реЗрд╡рд░ рд╕рдВрдЧрдд рд╣реИред

@RalfJung

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпреВрдирд┐рдпрди рдореЗрдВ рдХрднреА-рдХрднреА рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдЯрдХрд░рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ "рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ" рд╣реИ (IIRC @joshtriplett рдПрдХ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╕рднреА рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИ): рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдПрдХ рдпреВрдирд┐рдпрди рдХреЗ рд▓рд┐рдП 3 рд╡реЗрд░рд┐рдПрдВрдЯ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдж рдореЗрдВ рдФрд░ рд╡реЗрд░рд┐рдПрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ-рд╕рдВрдЧрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд╕рдВрдШ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рди рд╣реЛ)ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпреВрдирд┐рдпрди рдбреЗрдЯрд╛ рдХреЛ рдирд╣реАрдВ рдЫреВрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЯреИрдЧ (рдХрд╣реАрдВ рдФрд░ рдмреИрдареЗ) рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ!

рдпрд╣ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓рд╛ рд╣реИред
рдпрд╣ рдХреЗрд╡рд▓ C- рд╢реИрд▓реА рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ C рд╣реЗрдбрд░ рд╕реЗ рдЙрддреНрдкрдиреНрди Copy , рдмрд┐рд▓рдХреБрд▓ рд╕реНрдерд┐рд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗрдЯ) рд╣реИред
рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕реА рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ _dummy: () рдпрд╛ _future: () рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд "рдПрдирдо" рдореЙрдбрд▓ рд╕реЗ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдПрдлрдПрдлрдЖрдИ рд╕рдВрдШ рдПрдХ "рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ" рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рд╡реИрд╕реЗ рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

17 рдЕрдкреНрд░реИрд▓, 2018 10:08:54 AM PDT, рд╡рд╛рджрд┐рдо рдкреЗрдЯреНрд░реЛрдЪреЗрдирдХреЛрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕реА рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рдПрдХ _dummy: () рдпрд╛ _future: () рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд╕реБрд░рдХреНрд╖рд┐рдд "рдПрдирдо" рдореЙрдбрд▓ рд╕реЗ рд▓рд╛рдн рдЙрдард╛рддреЗ рд░рд╣реЗрдВред

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдпреВрдирд┐рдпрдиреЛрдВ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рд┐рд░реНрдл рд╡рд┐рд╡реЗрдХрд╢реАрд▓ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЬреНрдЮрд╛рди рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЙрдбрд▓ рдпрд╛ рдЙрдирдХреЗ рдЗрд▓рд╛рдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред рдореВрд▓ рдЪрд░реНрдЪрд╛ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЧреИрд░-рдПрдлрдПрдлрдЖрдИ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ "рдПрдХ рд╕рдордп рдореЗрдВ рдХрдИ рд╡реЗрд░рд┐рдПрдВрдЯ рдорд╛рдиреНрдп рдереЗ" рдореЙрдбрд▓ рдЪрд╛рд╣рддреЗ рдереЗ, рдЬрд┐рд╕рдореЗрдВ рдЧреИрд░-рдПрдлрдПрдлрдЖрдИ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рднреА рд╢рд╛рдорд┐рд▓ рдереЗред

рдПрдХ рд╕рдВрдШ рдореЗрдВ () рд╡реИрд░рд┐рдПрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЙрдирдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдмрд┐рдЯреНрд╕ рдХрд╛ рдПрдХ рдмреИрдЧ рд╣реЛрдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд░рд╕реНрдЯ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдлрдПрдлрдЖрдИ рд╕рдВрдШ
рдПрдХ "рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ" рд╣реЛрдирд╛ рдПрдХ рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╡реИрд╕реЗ рднреАред

рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рдЙрддрдиреЗ рд╣реА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рддрдирд╛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@RalfJung рдирд╣реАрдВ, рдпрд╣ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реБрдП auto trait s рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рд╕рдХреНрд░рд┐рдп рдХреНрд╖реЗрддреНрд░реЛрдВ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реИ рдФрд░ https://github.com/rust-lang/rust/issues/41073#issuecomment -380291471 рдкрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рд╣реИ

рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдмрд┐рдЯреНрд╕ рдХрд╛ рдПрдХ рдмреИрдЧ рд╣реЛрдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд░рд╕реНрдЯ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдареАрдХ рд╣реИ рдХрд┐ рдореИрдВ рдпреВрдирд┐рдпрдиреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ред рд╡реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирд┐рдЪреЛрдбрд╝рдиреЗ рдФрд░ рд╕реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдпреВрдирд┐рдпрди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ ~ рдХрд╛рд╕реНрдЯ / рдЯреНрд░рд╛рдВрд╕рдореАрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рди рд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреВрд╕рд░реЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдЕрдкреНрд░рдпреБрдХреНрдд рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдЖрдк ~ рдбреНрд░реЙрдкрд░реНрд╕ рдХреЛ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ std::ptr::drop_in_place рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЕрдЧрд░ рдореБрдЭреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЙрдирд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреИрд╕реЗ рдХрд░реВрдВрдЧрд╛:

рдЙрджрд╛рд╣рд░рдг - рд╕рдВрдШ рдХреЗ рд░реВрдк рдореЗрдВ mem::uninitialized рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛

pub union MaybeValid<T> {
    valid: T,
    invalid: ()
}

impl<T> MaybeValid<T> {
    #[inline] // this should optimize to a no-op
    pub fn from_valid(valid: T) -> MaybeValid<T> {
        MaybeValid { valid }
    }

    pub fn invalid() -> MaybeValid<T> {
        MaybeValid { invalid: () }
    }

   pub fn zeroed() -> MaybeValid<T> {
        // do whatever is necessary here...
        unimplemented!()
    }
}

fn example() {
    let valid_data = MaybeValid::from_valid(1_u8);
    // Destructor of a union always does nothing, but that's OK since our 
    // data type owns nothing.
    drop(valid_data);
    let invalid_data = MaybeValid::invalid();
    // Destructor of a union again does nothing, which means it needs to know 
    // nothing about its surroundings, and can't accidentally try to free unused memory.
    drop(invalid_data);
    let valid_data = MaybeValid::from_valid(String::from("test string"));
    // Now if we dropped `valid_data` we would leak memory, since the string 
    // would never get freed. This is already possible in safe rust using e.g. `Rc`. 
    // `union` is a similarly advanced feature to `Rc` and so new users are 
    // protected by the order in which concepts are introduced to them. This is 
    // still "safe" even though it leaks because it cannot trigger UB.
    //drop(valid_data)
    // Since we know that our union is of a particular form, we can safely 
    // move the value out, in order to run the destructor. I would expect this 
    // to fail if the drop method had run, even though the drop method does 
    // nothing, because that's the way stuff works in rust - once it's dropped
    // you can't use it.
    let _string_to_drop = unsafe { valid_data.valid };
    // No memory leak and all unsafety is encapsulated.
}

рдореИрдВ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдлрд┐рд░ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдвреАрд▓рд╛ рди рдХрд░реВрдВред
рдЦреЗрддреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП EDIT @SimonSapin рддрд░реАрдХрд╛ред

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдВрдШ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрд╛рд╕реНрдЯ / рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ (рдХрд╛рд╕реНрдЯ рдЯреНрд░рд╛рдВрд╕реНрдпреВрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдЕрдкреНрд░рдпреБрдХреНрдд рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдЗрд╕реЗ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдЖрдк рдбреНрд░реЙрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рдпрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

(рдпрджрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдПрдХ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ std::ptr::drop_in_place рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)

рд╕рдВрдмрдВрдзрд┐рдд: рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рддрд░реНрдХ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдирд┐рд░рдВрддрд░ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдШ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/51361 (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ ZST рдлрд╝реАрд▓реНрдб рд╣реИ рдЕрдЯрд▓ рд╕рддреНрдп)

рдореИрдВ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдлрд┐рд░ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдвреАрд▓рд╛ рди рдХрд░реВрдВред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдИрдореЗрд▓ рд╕реВрдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдкрд╛рджрди рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдирдИ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

@derekdreery (рдФрд░ рдмрд╛рдХреА рд╕рднреА) рдореИрдВ https://internals.rust-lang.org/t/pre-rfc-unions-drop-types-and-manuallydrop/8025 рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реВрдВрдЧрд╛

рд╕рдВрдмрдВрдзрд┐рдд: рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рддрд░реНрдХ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдирд┐рд░рдВрддрд░ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдШ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: # 51361

рдореИрдВрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрд╛ рд╣реИ рд▓реЗрдХрд┐рди рддрд░реНрдХ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред ;)

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ ... рддрд░реНрдХ "рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЬреАрдм рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛" рджреНрд╡рд╛рд░рд╛ред

рдореБрдЭреЗ рдХреЛрдИ рднреА рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рд╣рдо рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдЪреЗрдХрд░ рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд╣рдореЗрд╢рд╛ рдпрд╣ рдерд╛ рдХрд┐ рд╕рдВрдШ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдиреНрдпрдерд╛, рдпреВрдирд┐рдпрдиреЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╕реБрдВрджрд░ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ "рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рдмрд┐рдЯреНрд╕ рдХреЗ рдмреИрдЧ" рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдБрдЪ рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдЬреАрдм рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

AFAIK рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд░реНрд▓рд┐рди рдХреЗ рд╕рднреА рд╣рд╛рдереЛрдВ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдХреБрдЫ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ @joshtriplett рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рдВрдШ рдХрд╛ рдкрд╣рд▓рд╛ рдЖрдзрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдЖрдзрд╛ рдХреБрдЫ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ "рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП рдмрд┐рдЯреНрд╕ рдХреЗ рдмреИрдЧ" рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдБрдЪ рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдЬреАрдм рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

рдореИрдВ рд╣рдореЗрд╢рд╛ рдпрджреНрдпрдкрд┐ рдпрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреБрдЫ рд╣рдж рддрдХ рднрд╛рд╖рд╛ рдХреА рднрд╛рд╡рдирд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рддреА рд╣реИред
рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╣рдо рдлреБрдЯрдЧрдгреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЕрд╕рдВрдЧрдард┐рдд рдпрд╛ рдЙрдзрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрдЪрд╛рдирдХ рдЕрдХреНрд╖рдо рд╣реИрдВ, рдХреГрдкрдпрд╛ рд╢реВрдЯ рдХрд░реЗрдВред

рдореИрдВ union рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрдХреНрд╖рдо рд╣реИрдВред рдпреВрдирд┐рдпрдиреЗрдВ рдбреЗрдЯрд╛ рд▓реЗрдЖрдЙрдЯ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдХреАрдордд рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ union рд╕рд░рд▓ рдмрдирд╛рддрд╛

рд╣рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рд▓рд╛рдЧрдд рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмреИрдЧ-рдСрдл-рдмрд┐рдЯреНрд╕ рдореЙрдбрд▓ рдПрдирдо-рдЕрдирдиреЛрди-рд╡реЗрд░рд┐рдПрдВрдЯ рдореЙрдбрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдИ рдирдпрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдкреНрд░рд╢реНрди рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХрдо рд╕реЗ рдХрдо рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЛрдЭ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╣реИред рдХреЛрдИ рднреА рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЙрди рд╕рднреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЯрд╛рдЗрдк 1 рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП "рдЕрдирдЬрд╛рди рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдирдо" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХреЛрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕реБрдкрд░ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ рд╕рдВрдШ рдпрд╛ рдЬреЛрдЦрд┐рдо рддрддреНрдХрд╛рд▓ рдпреВрдмреА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдШ рд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЕрд╕рдорд╛рдирддрд╛ рдХреЛ рдХрдо рдХрд┐рдП рдмрд┐рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЪреИрдирд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдХрд▓рдХ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ) рдХрд┐ рдмрд┐рдЯреНрд╕ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рдРрд╕реЗ рд╕рдВрдШ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рдХрд┐рд╕реА рднреА рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рдЬрдм рдпрд╣ рдореАрд░реА рдХреЗ рддрд╣рдд рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рди рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

1 рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЯреБрдкрд▓реНрд╕ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП repr (C) рд╣реИрдВ, union Foo { a: (bool, u8), b: (u8, bool) } рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдлрд╝реАрд▓реНрдб рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЕрдорд╛рдиреНрдп рд╣реИрдВред

@rkruppe

рд╕рдВрдШ рдлреВ {a: (рдмреВрд▓, рдпреВ 8), рдмреА: (рдпреВ 8, рдмреВрд▓)}

рдЕрд░реЗ, рдпрд╣ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ :)
рдФрд░ рдпрд╣ RFC 1897 рдХреЗ рдореЙрдбрд▓ (рдХрдо рд╕реЗ рдХрдо рдПрдХ "рдкрддреНрддреА" рдЯреБрдХрдбрд╝реЗ bool -1, u8 -1, u8 -2, bool рддрд╣рдд рдорд╛рдиреНрдп рд╣реИ -2 рдХрд┐рд╕реА рднреА рдЖрдВрд╢рд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдж рд╡реИрдз рд╣реИ)ред

рдХреЛрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕реБрдкрд░ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдВрдШ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ рдпрд╛ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдХреЛ рдЬреЛрдЦрд┐рдо рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрд░рдПрдлрд╕реА 1897 рдХреЗ рдореЙрдбрд▓ рдХреА рдмрд╛рдд рд╣реИ, рд╕реНрдерд┐рд░ рдЬрд╛рдБрдЪ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди (рдХрд╛рдо рдпрд╛ рдЖрдВрд╢рд┐рдХ рдХрд╛рдо рдХреА рддрд░рд╣) рддрд╛рдХрд┐ рдЖрдк рд╕реБрдкрд░ рд╕рд╛рд╡рдзрд╛рди рд╣рд░ рд╕рдордп рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрдШ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдирд╣реАрдВ рдорд┐рд▓рддрд╛ ред
рдХреЗрд╡рд▓ рдХреЗрдВрджреНрд░реАрдп-рдЕрд╕рдВрдмрджреНрдз рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдЬреИрд╕реЗ рдЬрдВрдЧрд▓реА рд╕рдВрдХреЗрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдПрдХ рд╕рдВрдШ рдХреЛ рдЕрдорд╛рдиреНрдп рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рджреВрд╕рд░реА рдУрд░, рдЪрд╛рд▓ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд┐рдирд╛ , рд╕рдВрдШ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

let u: Union;
let x = u.field; // UB

рдпрд╣ RFC 1897 рдХреЗ рдореЙрдбрд▓ рдХреА рдмрд╛рдд рд╣реИ, рд╕реНрдереИрддрд┐рдХ рдЬрд╛рдБрдЪ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди (рдЬреИрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдпрд╛ рдЖрдВрд╢рд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рд╕рдВрдШ рдХреЛ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╣рд░ рд╕рдордп рд╕реБрдкрд░ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░реЗрдВ ред
рдХреЗрд╡рд▓ рдХреЗрдВрджреНрд░реАрдп-рдЕрд╕рдВрдмрджреНрдз рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдЬреИрд╕реЗ рдЬрдВрдЧрд▓реА рд╕рдВрдХреЗрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдПрдХ рд╕рдВрдШ рдХреЛ рдЕрдорд╛рдиреНрдп рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рд▓рдЧрд╛рдП рдЧрдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдХреНрд░рдордгрдХрд╛рд░реА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЗрдЦрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдкрдврд╝рдирд╛ рдЕрднреА рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рдЯреНрд╕ рдЙрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реЛрдВрдЧреЗ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рдардХреЛрдВ рдХреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдЬреАрд╡рди рдХреЛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред рди рддреЛ "рдмрд┐рдЯреНрд╕ рдХрд╛ рдмреИрдЧ" рдФрд░ рди рд╣реА "рдЕрдЬреНрдЮрд╛рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдирдо" рдпреВрдирд┐рдпрдиреЛрдВ рдХреА рдХрдард┐рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХрдЯреНрдЯрд░рдкрдВрдереА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдбреНрд░реЛрдкрд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧреА? рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдВрдШ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ C рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдЬрдВрдЧ рдбреЗрдЯрд╛ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рд╢рд╛рдпрдж рдПрдХ рдбрдмрд▓-рдлреНрд░реА? рдпрд╛ рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрд╢рд╛ Drop рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ?

рдпрджрд┐ рд╕реБрдЭрд╛рд╡ "рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рд╡реИрд░рд┐рдПрдВрдЯ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ", рддреЛ рдЕрдЧрд░ рдпрд╣ рд╕реБрдЭрд╛рд╡ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рддреЛ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рдмреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

рдФрд░ рдпрд╣ RFC 1897 рдХреЗ рдореЙрдбрд▓ (рдХрдо рд╕реЗ рдХрдо "рдкрддреНрддреА" рдЕрдВрд╢реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмреВрд▓ -1, u8-1, u8-2, рдмреВрд▓ -2 рдХрд┐рд╕реА рднреА рдЖрдВрд╢рд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдж рдорд╛рдиреНрдп рд╣реИ) рдХреЗ рддрд╣рдд рдорд╛рдиреНрдп рд╣реИред

рдЕрдЧрд░ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡реИрдз рд╣реЛ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ рдУрд▓реА-рдУрдмреЗрдХ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд░рд┐рдХ рдХреЗ рдЪреЗрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - https://github.com/rust-lang/rust/pull/51361 рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдорд┐рд░реАред

@petrochenkov рдЬрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдореИрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛, рд╡рд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЦрд░реАрджрддрд╛ рд╣реИред рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг) рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрднреА рднреА рд╕рдЯреАрдХ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдХрд┐ рдЬрдм рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ

рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рд▓реЗрдЖрдЙрдЯ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рдиред "рдмрд┐рдЯреНрд╕" рдореЙрдбрд▓ рдореЗрдВ, рдПрдХ рд╕рдВрдШ рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЖрд▓рд╛, рдХрднреА рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЖрд▓рд╛ рдкрд░ рдЕрдзрд┐рдХ рдореИрдиреБрдЕрд▓ рдирд┐рдпрдВрддреНрд░рдг рджреЗрдХрд░ рдмреЗрд╣рддрд░ рдкрддреЗ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рдореМрд▓рд┐рдХ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИред рдореИрдВ @rkruppe рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ
рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрдард┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣реА рд╣реИ рдХрд┐ рд╕рдВрдШ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ
рд╡рд╣ рдбреЗрдЯрд╛ рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди AFAIK рдХреЛ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ "рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ" рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо
рдХрдо рд╕реЗ рдХрдо рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рддрдм рднреА рдпрд╣ рд╣реЛрдЧрд╛
рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рд╕рдорд╕реНрдпрд╛ред

рддреЛ ... рдХреНрдпрд╛ рдореЗрдЬ рдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ? рдпрд╛, рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдЯреАрдХ рд╕рдорд╛рдзрд╛рди рд╣рдореЗрдВ рдЦрд░реАрджрддреЗ рд╣реИрдВ? рдХрд╣реЛ рдореБрдЭреЗ C рд╕реЗ рдПрдХ рд╕рдВрдШ рдорд┐рд▓рддрд╛ рд╣реИ,
рдкреВрд░реЗ рдЬрдВрдЧ рдФрд░ рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдмрд┐рдирд╛, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд╛рд░рдВрдЯреА рд╣реИ?

@gnzlbg рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд╣реА рдЧрд╛рд░рдВрдЯреА рдорд┐рд▓реЗрдЧреА рдЬреЛ @petrochenkov рдиреЗ рдКрдкрд░ рд▓рд┐рдЦреА рд╣реИ

рд╕реНрдереИрддрд┐рдХ рдЬрд╛рдБрдЪ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди (рдЬреИрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдпрд╛ рдЖрдВрд╢рд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рд╕рдВрдШ рдХреЛ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ

рджреВрд╕рд░реА рдУрд░, рдЪрд╛рд▓ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд┐рдирд╛, рд╕рдВрдШ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдкрдврд╝реЗ рдЬрд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рдмрдЪрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реНрдб" рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреА рдХрд▓реНрдкрдирд╛ рдХреА, "рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ"ред рд╣рдореЗрдВ рдХреБрдЫ рднреА рддрдм рдЪрд╛рд╣рд┐рдП рд╣реЛрдЧрд╛ рдЬрдм impl Drop for MyUnion рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛред рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдбреНрд░реЙрдк рдХреЙрд▓ рдХрдм рдФрд░ рдХрд╣рд╛рдБ рдбрд╛рд▓реЗрдВред рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдореМрдЬреВрджрд╛ рд╕реВрдХреНрд╖реНрдо рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рдбрд╛рд▓ рд░рд╣реЗ рд╣реИрдВред рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ Drop рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рднреА struct рд╕рдорд╛рди рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдХрд▓реНрдкрдирд╛ рдХреА рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдВрднрд┐рдХ рд╣реЛрдиреЗ рддрдХ рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

@derekchiang

рдпреВрдирд┐рдпрдиреЛрдВ рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рдмреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?
рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд┐рдЯреНрд╕ рдХрд╛ рдПрдХ рдмреИрдЧ рд╣реИ, рддреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпреВрдирд┐рдпрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирдВрдЧреЗ-рдиреНрдпреВрдирддрдо рдореВрд╡ рдЪреЗрдХ рдореЗрдВ рд╡реИрд▓реНрдпреВ рд╣реИред рдореВрд▓ RFC рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдпрд╛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдкреВрд░реЗ рд╕рдВрдШ рдХреЛ рдЖрд░рдВрднрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдВрдЧ рдХреЛ рдХрд┐рд╕реА рд╕рдВрдШ рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдПрдХ рдпреВрдирд┐рдпрди рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рднреА рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдРрд╕рд╛ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬреЛ рдЙрд╕рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдпреВрдирд┐рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред рдЙрд╕ рд╕рдВрдШ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ C рдФрд░ Rust рдХреЛрдб рдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд╛рдирдирд╛ тАЛтАЛрдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИред

@RalfJung

рд╢рд╛рдпрдж рдореБрдЭреЗ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб 1) рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП 2) рдЧреИрд░-рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

let x: T;
let y = x.field;

рдореЗрд░реЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╡рд╛рдм рд╕реНрдкрд╖реНрдЯ "рдирд╣реАрдВ" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реЗрдгреА рд╣реИ, рдЬреЛ рд░реБрд╕реНрдЯ T рдХреЗ "рд╕рдВрдШ" -рдЗрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЪрд╛рд▓ рдЪреЗрдХрд░ рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рд╕реНрдХреАрдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд╣ рдЙрд╕ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЪрд╛рд▓рди рдкрд░реАрдХреНрд╖рдХ (рдФрд░ рдЙрдзрд╛рд░рдХрд░реНрддрд╛ рдЪреЗрдХрд░) рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рддрд┐ рдХреНрд╖реЗрддреНрд░ рдлреИрд╢рди рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдпреЛрдЬрдирд╛ "рдПрдХ рд╣реА рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧреА + (рдбреА) рдЖрд░рдВрднреАрдХрд░рдг / рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдзрд╛рд░ рднреА (рдбреА) рдЕрдкрдиреЗ рднрд╛рдИ рдХреЗ рдЦреЗрддреЛрдВ рдХреЛ рд╢реБрд░реВ / рдЙрдзрд╛рд░ рд▓реЗрддрд╛ рд╣реИред "ред
рдпрд╣ рд╕рд░рд▓ рдирд┐рдпрдо рд╕рднреА рд╕реНрдереИрддрд┐рдХ рдЬрд╛рдБрдЪ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░, рдПрдирдо рдореЙрдбрд▓ рдХреЗрд╡рд▓ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рд░ рдЬрд╛рдБрдЪ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ + рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐ред
рдпрджрд┐ 1) рдЖрд░рдВрднреАрдХрд░рдг рдЬрд╛рдБрдЪ рд╕рдХреНрд╖рдо рд╣реИ рдФрд░ 2) рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╕рдВрдШ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрдорд╛рдиреНрдп рдмрд╛рдЗрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ "рдкрддреНрддреА" рдлрд╝реАрд▓реНрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡реИрдз рд╣реИред рдпрд╣ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрдирдЪреЗрдХреЗрдмрд▓ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП> 1 рдлрд╝реАрд▓реНрдб рдФрд░ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓-рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд╣рд░) рдЧрд╛рд░рдВрдЯреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдкрд░ рд▓рдХреНрд╖рд┐рдд рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @joshtriplett рд╕реЗ рдпрд╣ рдорд╛рдорд▓рд╛

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдпреВрдирд┐рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред рдЙрд╕ рд╕рдВрдШ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ C рдФрд░ Rust рдХреЛрдб рдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд╛рдирдирд╛ тАЛтАЛрдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИред

рдпрджрд┐ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ "рд╕рдВрднрд╛рд╡рд┐рдд рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди" рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдерд╛, рддреЛ рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред

рдмреЗрд╢рдХ, рд╣рдо рдмреБрдирд┐рдпрд╛рджреА рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдЬрд╛рдБрдЪ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рд╢рд░реНрдд рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд "рдерд░реНрдб рдкрд╛рд░реНрдЯреА" рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рд╕рдВрдШ рдХреЛ рдЕрд╡реИрдз рд░реВрдк рд╕реЗ рдЕрд╡реИрдз рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдХреЗ рдмрд┐рдирд╛ рд╣реИред рддрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдЧ-рд▓рдХреНрд╖рд┐рдд рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реЛрдЧреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реБрджреНрдз рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред

@petrochenkov

рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб 1) рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП 2) рдЧреИрд░-рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

let x: T;
let y = x.field;

рдореЗрд░реЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╡рд╛рдм рд╕реНрдкрд╖реНрдЯ "рдирд╣реАрдВ" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реЗрдгреА рд╣реИ, рдЬреЛ рд░реБрд╕реНрдЯ T рдХреЗ "рд╕рдВрдШ" -рдЗрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╕рд╣рдордд, рдЕрд╕рдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд╛ рдпрд╣ рд╕реНрддрд░ рдЙрдЪрд┐рдд рдФрд░ рдХрд╛рдлреА рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЪрд╛рд▓ рдЪреЗрдХрд░ рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рд╕реНрдХреАрдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд╣ рдЙрд╕ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЪрд╛рд▓рди рдкрд░реАрдХреНрд╖рдХ (рдФрд░ рдЙрдзрд╛рд░рдХрд░реНрддрд╛ рдЪреЗрдХрд░) рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рддрд┐ рдХреНрд╖реЗрддреНрд░ рдлреИрд╢рди рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдпреЛрдЬрдирд╛ "рдПрдХ рд╣реА рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧреА + (рдбреА) рдЖрд░рдВрднреАрдХрд░рдг / рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдзрд╛рд░ рднреА (рдбреА) рдЕрдкрдиреЗ рднрд╛рдИ рдХреЗ рдЦреЗрддреЛрдВ рдХреЛ рд╢реБрд░реВ / рдЙрдзрд╛рд░ рд▓реЗрддрд╛ рд╣реИред "ред
рдпрд╣ рд╕рд░рд▓ рдирд┐рдпрдо рд╕рднреА рд╕реНрдереИрддрд┐рдХ рдЬрд╛рдБрдЪ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред

рдЕрдм рддрдХ рд╕рд╣рдордд рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдирд┐рдпрдореЛрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред

рдлрд┐рд░, рдПрдирдо рдореЙрдбрд▓ рдХреЗрд╡рд▓ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рд░ рдЬрд╛рдБрдЪ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ + рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐ред
рдпрджрд┐ 1) рдЖрд░рдВрднреАрдХрд░рдг рдЬрд╛рдБрдЪ рд╕рдХреНрд╖рдо рд╣реИ рдФрд░ 2) рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╕рдВрдШ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрдорд╛рдиреНрдп рдмрд╛рдЗрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ "рдкрддреНрддреА" рдлрд╝реАрд▓реНрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡реИрдз рд╣реИред рдпрд╣ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрдирдЪреЗрдХреЗрдмрд▓ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП> 1 рдлрд╝реАрд▓реНрдб рдФрд░ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓-рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд╣рд░) рдЧрд╛рд░рдВрдЯреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдкрд░ рд▓рдХреНрд╖рд┐рдд рд╣реИред

рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд░реНрдд рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @joshtriplett рд╕реЗ рдпрд╣ рдорд╛рдорд▓рд╛

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдпреВрдирд┐рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред рдЙрд╕ рд╕рдВрдШ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ C рдФрд░ Rust рдХреЛрдб рдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд╛рдирдирд╛ тАЛтАЛрдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИред

рдпрджрд┐ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ "рд╕рдВрднрд╛рд╡рд┐рдд рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди" рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдерд╛, рддреЛ рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред

рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реА рдпреВрдирд┐рдпрдиреЛрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рди рд╣реА рд░рд╕реНрдЯ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред (рдФрд░ рдореИрдВ рд╕рд╡рд╛рд▓ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рдпрд╛ рдмрд╕ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред) рдЗрд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рд░рд╕реНрдЯ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЙрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд┐рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдмреЗрд╢рдХ, рд╣рдо рдмреБрдирд┐рдпрд╛рджреА рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдЬрд╛рдБрдЪ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рд╢рд░реНрдд рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд "рдерд░реНрдб рдкрд╛рд░реНрдЯреА" рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рд╕рдВрдШ рдХреЛ рдЕрд╡реИрдз рд░реВрдк рд╕реЗ рдЕрд╡реИрдз рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдХреЗ рдмрд┐рдирд╛ рд╣реИред рддрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдЧ-рд▓рдХреНрд╖рд┐рдд рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реЛрдЧреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реБрджреНрдз рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдЙрди "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд" рддреГрддреАрдп рдкрдХреНрд╖ "рдХрд╛ рдЕрд░реНрде рд╣реИ" рдПрдлрдПрдлрдЖрдИ рд╕реЗ рдПрдХ рд╕рдВрдШ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ "рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

union Event {
    event_id: u32,
    event1: Event1,
    event2: Event2,
    event3: Event3,
}

struct Event1 {
    event_id: u32, // always EVENT1
    // ... more fields ...
}
// ... more event structs ...

match u.event_id {
    EVENT1 => { /* ... */ }
    EVENT2 => { /* ... */ }
    EVENT3 => { /* ... */ }
    _ => { /* unknown event */ }
}

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рдХреЛрдб рд╣реИ рдЬреЛ рд▓реЛрдЧ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@petrochenkov

рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб 1) рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП 2) рдЧреИрд░-рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдореЗрд░реЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрддреНрддрд░ рд╕реНрдкрд╖реНрдЯ "рдирд╣реАрдВ" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реЗрдгреА рд╣реИ, рдЬреЛ рдХрд┐ рдЯреА рдХреЗ "рд╕рдВрдШ" рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЬрдВрдЧ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рд╣реИред

рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдпреЛрдЬрдирд╛ "рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ + (рдбреА) рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди / рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЙрдзрд╛рд░ рдХреЗ рд╕рдорд╛рди рдирд┐рдпрдо (рдбреА) рдЕрдкрдиреЗ рд╕рд┐рдмрд▓рд┐рдВрдЧ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ / рд▓реЛрди рджреЗрдирд╛ рд╣реЛрдЧрд╛"ред

рдУрд╣ред рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдирд┐рдпрдо рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ ред рдЖрдк рдХреЗрд╡рд▓ рдЙрд╕ рдореВрд▓ рдзрд╛рд░рдгрд╛ рдХреЛ рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдФрд░ рдЕрднреА рднреА рдЙрд╕реА рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдореИрдВ рдХрднреА рдирд╣реАрдВ рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреАред рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рдХреЛрдИ рдЙрдирд╕реЗ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдирдореЛрдВ рдХреЗ рд╕рдорд╛рди рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдирдореЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдореИрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ 1) рдЖрд░рдВрднреАрдХрд░рдг рдЬрд╛рдБрдЪ рд╕рдХреНрд╖рдо рд╣реИ рдФрд░ 2) рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╕рдВрдШ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрдорд╛рдиреНрдп рдмрд╛рдЗрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ "рдкрддреНрддреА" рдлрд╝реАрд▓реНрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡реИрдз рд╣реИред рдпрд╣ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрдирдЪреЗрдХреЗрдмрд▓ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП> 1 рдлрд╝реАрд▓реНрдб рдФрд░ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓-рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд╣рд░) рдЧрд╛рд░рдВрдЯреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдкрд░ рд▓рдХреНрд╖рд┐рдд рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреБрдирд┐рдпрд╛рджреА рд╡реИрдзрддрд╛ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪ рдпреЛрдЧреНрдп (рджреА рдЧрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА) рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдВрдд рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдлрд┐рд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдорд┐рд░рд┐ рдореЗрдВ CTFE рдХреЗ рджреМрд░рд╛рди рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ "рдкреВрд░реНрдг" рдорд┐рд░реНрд░реА рд░рди (рдЬреИрд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ) рдХреЗ рджреМрд░рд╛рди рднреА рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЕрдВрддрддрдГ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝рд░ рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдРрд╕рд╛ рдореЛрдб рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдкрд░ рд░реБрд╕реНрдЯ debug_assert! рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реА рдХреЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдмреВрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдкрд╣рд▓рд╛ рдХрджрдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭрдиреЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдпреЛрдЧреНрдп рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдХреНрдпрд╛ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдЧрд╛рдорд┐рддрд┐ рд╕реНрдореГрддрд┐ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, "рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдпреЛрдЧреНрдп" рд╡реЗрд░рд┐рдПрдВрдЯ (рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдХреЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рдордЭрд╛рддреЗ рд╣реБрдП рдкрд░рд┐рдЪрд╛рд▓рди рд╢рдмреНрджрд╛рд░реНрде) рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рдХреА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рдЦреБрд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдореЙрдбрд▓ рдЬреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗ ("рдкрддрд▓реА рд╣рд╡рд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ ouf" рдпрд╣рд╛рдВ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ)ред

рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдУрд╡рд░рд╕реНрдЯреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдпреЛрдЧреНрдп рдирд┐рдпрдо рд╣реЛрдирд╛ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпреВрдмреА рдХреЗ 0 рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдорд╛рдорд▓реЛрдВ рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред (рд╣рдо рдЕрднреА рддрдХ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред) рдЖрдкрдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдпреВрдмреА рд╣реЛрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рдХ / рднрд╛рд╖рд╛ рд▓реЗрдЦрдХреЛрдВ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рд╣рд░ рдХрд┐рд╕реА рдХреА рдХреАрдордд рдкрд░ рдЙрдирдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЬреАрдирд╛ рд╣реИред (рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдФрд░ рд░реЙ рдкреЙрдЗрдВрдЯрд░ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдпреЛрдЧреНрдп рдирд┐рдпрдореЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред)
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ "рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ" рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЖрдзрд╛рд░ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рдХреЛрдИ рдореМрд▓рд┐рдХ рдХрд╛рд░рдг рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдБрдЪ рдпреЛрдЧреНрдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд╕рдВрдШ рдореЗрдВ рд╣рд░ рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП, рд╕рднреА рд╡реЗрд░рд┐рдПрдВрдЯ рдкрд░ рдЬрд╛рдПрдБ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рдЙрд╕ рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдХреМрди-рд╕реЗ рд╡реИрд▓реНрдпреВрдЬрд╝ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдФрд░ рдпреВрдирд┐рдпрди (рд╣реЗрд╣;) рдХреЛ рд▓реЗрдВ рдЙрди рд╕реЗрдЯреЛрдВ рдореЗрдВ рд╕реЗред рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдХреНрд░рдо рдПрдХ рдпреВрдирд┐рдпрди рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдиреНрдп рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЪреЗрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрдард┐рди рд╣реИ - рдЕрдм рддрдХ рдХреЗ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡реИрдзрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдореЗрдВ рд╣рдо рд░реБрд╕реНрдд рдореЗрдВ рд╣реЛрдВрдЧреЗред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрдзрддрд╛ рдирд┐рдпрдо рдХреБрдЫ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рдмреЗрд╢рдХ, рд╣рдо рдмреБрдирд┐рдпрд╛рджреА рд╕реНрдереИрддрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдЬрд╛рдБрдЪ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рд╢рд░реНрдд рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд "рдерд░реНрдб рдкрд╛рд░реНрдЯреА" рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рд╕рдВрдШ рдХреЛ рдЕрд╡реИрдз рд░реВрдк рд╕реЗ рдЕрд╡реИрдз рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдХреЗ рдмрд┐рдирд╛ рд╣реИред рддрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдЧ-рд▓рдХреНрд╖рд┐рдд рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реЛрдЧреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реБрджреНрдз рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред

рд╡рд╣ рдЧрд╛рд░рдВрдЯреА рд╣рдореЗрдВ рдХреНрдпрд╛

@joshtriplett

рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдШ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред рдЙрд╕ рд╕рдВрдШ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ C рдФрд░ Rust рдХреЛрдб рдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд╛рдирдирд╛ тАЛтАЛрдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИред

@Petrochenkov рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдореЙрдбрд▓ рдЙрди usecases рдХреЛ рд╕рдВрдШ рдореЗрдВ __non_exhaustive: () рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдХрд░ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЬрдирд░реЗрдЯрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

@RalfJung

рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП> 1 рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓-рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд╣рд░) рдЧрд╛рд░рдВрдЯреА

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреБрдирд┐рдпрд╛рджреА рд╡реИрдзрддрд╛ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдпреЛрдЧреНрдп рд╣реИ

рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: рдореЗрд░рд╛ рдорддрд▓рдм "рд░рд┐рд▓реАрдЬ рдореЛрдб рдореЗрдВ" рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд" рдерд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде "рд╕реНрд▓реЛ рдореЛрдб" рдореЗрдВ рдЬрд╛рдВрдЪ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭрд╕реЗ рдмреЗрд╣рддрд░ рд▓рд┐рдЦрд╛ред

@RalfJung

@Petrochenkov рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдореЙрдбрд▓ рдЙрди

рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЬрдирд░реЗрдЯрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╡реЗ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╣рд░ рдПрдХ рд╕рдВрдШ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдЕрднреА рддрдХ рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рджреЗрдЦрдирд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдпрд╣ рдХреБрдЫ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреМрди рд╕реЗ рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@joshtriplett

рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдХреНрдпреЛрдВ рд╣реИред
рдпрд╣ repr(C) рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдлрдПрдлрдЖрдИ рдореЗрдВ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧ / "рд░рд╕реНрдЯ рдПрдирдо рдПрдореБрд▓реЗрд╢рди" рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдорд╛рдирддреЗ рд╣реИрдВ (рдЬреЛ рд╕рдЪ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ repr(Rust) рдпреВрдирд┐рдпрдиреЛрдВ (рдбреНрд░реЙрдк рдХрдВрдЯреНрд░реЛрд▓, рдЗрдВрдЯрд┐рд▓рд╛рдЗрдЬреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓, рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯреНрд╕) "рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯ" рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЕрдЪрд╛рдирдХ рдЙрдирдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

@petrochenkov рдореИрдВ рдХрд╣рдирд╛ рдирд╣реАрдВ рдерд╛ "рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рддреЛрдбрд╝рдиреЗ", рдореИрдВрдиреЗ рдХрд╣рд╛ "рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ"ред рдПрдлрдПрдлрдЖрдИ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдФрд░ рдЙрди рд╕рднреА рд╕реЗрдЯреЛрдВ рдХрд╛ рд╕рдВрдШ (рд╣реЗрд╣;) рд▓реЗрдВ

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмрдпрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдХрд░реНрд╖рдХ рд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ рдХрд┐ "рдПрдХ рд╕рдВрдШ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рдЗрд╕рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдВрдШ рд╣реИрдВ ..."

рд╕рдЪред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИ - рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдиреВрдиреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

union F {
  x: (u8, bool),
  y: (bool, u8),
}
fn foo() -> F {
  let mut f = F { x: (5, false) };
  unsafe { f.y.1 = 17; }
  f
}

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП unsafe рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╕рдВрдШ рдХреЛ рдХрдо рд╕реЗ рдХрдо, рдЕрд▓рд╡рд┐рджрд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рдЖрдХрд░реНрд╖рдХ рд╕реНрдкрд╖реНрдЯрддрд╛" рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рднреА рдЖрдХреНрд░рдордг рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмреЛрдЭ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдареЛрд╕ рд▓рд╛рдн рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред

@RalfJung

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдирдП MIR- рдЖрдзрд╛рд░рд┐рдд рдЕрдиреИрдлрд┐рд╕рд┐рдЯреА-рдЪреЗрдХрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреБрд░рд╛рдиреЗ HIR- рдЖрдзрд╛рд░рд┐рдд рдореЗрдВ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЪреЗрдХрд░ рд╕реАрдорд╛ / рд╕рд░рд▓реАрдХрд░рдг рдерд╛ - рдХреЗрд╡рд▓ expr1.field = expr2 рдХреЗрд╡рд▓ рднрд╛рд╡реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдВрднрд╡ рдерд╛ - рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ "рдЕрдирдлрд╕рд▓реА рдСрдкреНрдЯ-рдЖрдЙрдЯ, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ" рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ "рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

Https://github.com/rust-lang/rust/issues/52786#issuecomment -408645420 рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдЙрддреНрддрд░ рджреЗрдВ:

рддреЛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЕрднреА рднреА Wrap<T> рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, Wrap рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░, Wrap<T> рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ "рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдорд╛рди" рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рдХ рдЙрдирдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Wrap s рдЕрдиреБрдмрдВрдз рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреНрд╖реЗрддреНрд░ рдЧреЛрдкрдиреАрдпрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреИрд╕реЗ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдирд┐рдЬреА рдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдореВрд▓реНрдп рд╕реАрдзреЗ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдлрдПрдлрдЖрдИ рдХреЗ рджреВрд╕рд░реА рддрд░рдл рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░ рдпрд╛ рдХреЛрдб рдХреА рддрд░рд╣ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдкреВрд░реЗ рдпреВрдирд┐рдпрди рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдиреЗ рд╕реЗред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реЛрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рджрд┐рд╢рд╛ рдореЗрдВ рдкрд╣реБрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реВрдВ, рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ (рд╕рдВрдШ рдпрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛) рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирдЬрд╛рди рдЕрдкрд░рд┐рдЪрд┐рдд рд╕реЗ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ (рд╕реАрдзреЗ рдпрд╛ рдЬрдВрдЧрд▓реА рд╕рдВрдХреЗрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, doesn ' t рдорд╛рдорд▓рд╛) UB рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рдПрдХ рд╕рдВрдШ рдПрдХ рднреА рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рд╣реИ, рддреЛ рдЗрд╕рдХреА implementer (рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ) рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐ рдХреЛрдИ рддреАрд╕рд░рд╛ рдкрдХреНрд╖ рд╣реИ рдХрд┐ рд╕рдВрдШ рдореЗрдВ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдореВрд▓реНрдп рд▓рд┐рдЦреЗрдВрдЧреЗред
рдпрд╣ рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдпреВрдирд┐рдпрди рдкреНрд░рд▓реЗрдЦрди рдХреНрд▓реЙрдЬ" рд╣реИ:
- (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдпрджрд┐ рдХрд┐рд╕реА рдпреВрдирд┐рдпрди рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рд╣реИ рддреЛ рдЖрдк рдЙрд╕рдореЗрдВ рдХрдЪрд░рд╛ рдирд╣реАрдВ рд▓рд┐рдЦ
- рдЕрдиреНрдпрдерд╛, рдЖрдк рдХрдЪрд░реЗ рдХреЛ рдПрдХ рд╕рдВрдШ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕рдХреЗ рдбреЙрдХреНрд╕ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдХреБрдЫ рдпреВрдирд┐рдпрди рдЕрдкрдиреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ pub рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣рдорд▓рд╛рд╡рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ), рддреЛ рдпрд╣ рдЕрднреА рднреА рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реАрд▓рд┐рдП "рдЬрдм рддрдХ" рджреВрд╕рд░рд╛ рдЦрдВрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИред

@RalfJung
рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЛ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ?

рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

mod m {
    union MyPrivateUnion { /* private fields */ }
    extern {
        fn my_private_ffi_function() -> MyPrivateUnion; // Can return garbage (?)
    }
}

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реВрдВ, рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ (рд╕рдВрдШ рдпрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛) рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирдЬрд╛рди рдЕрдкрд░рд┐рдЪрд┐рдд рд╕реЗ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ (рд╕реАрдзреЗ рдпрд╛ рдЬрдВрдЧрд▓реА рд╕рдВрдХреЗрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, doesn ' t рдорд╛рдорд▓рд╛) UB рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдирд╣реАрдВ, рдпрд╣ рдореЗрд░рд╛ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдХрдИ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рддрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рджреЛ рд╣реЛрдВрдЧреЗ (рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрдирдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рдирд╛рдо рдирд╣реАрдВ рд╣реИрдВ):

  • рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд▓реЗрдЖрдЙрдЯ-рд╕реНрддрд░реАрдп рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ" (рдпрд╛ "рд╕рд┐рдВрдЯреЗрдХреНрдЯрд┐рдХ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ") рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХреЗ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпреЗ " &mut T рдЧреИрд░-рдкреВрд░реНрдг рдФрд░ рдЧрдардмрдВрдзрди" рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, " bool 0 рдпрд╛ 1 ", " ! рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдореМрдЬреВрдж"ред рдЗрд╕ рд╕реНрддрд░ рдкрд░, *mut T usize - рджреЛрдиреЛрдВ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (рдпрд╛ рд╢рд╛рдпрдж рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкрд░, рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрдВрддрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ)ред рд╣рдо рдЕрдВрддрддрдГ, рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреБрдирд░реНрд╕рдВрдХреНрд░рдордг рджреНрд╡рд╛рд░рд╛ рдЗрди рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╡рд░реНрддрдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ: рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд▓реЗрдЖрдЙрдЯ-рд╕реНрддрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЙрдирдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдмрдирд╛рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрджрд┐ рджреГрд╢реНрдпрддрд╛ рдпрд╣рд╛рдВ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддреА рд╣реИред
Violating the layout-level invariant is instantaneous UB. This is a statement we can make because we have defined this invariant in very simple terms, and we make it part of the definition of the language itself. We can then exploit this UB (and we already do), e.g. to perform enum layout optimizations.
  • рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░реАрдп рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ" (рдпрд╛ "рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ") рдЬреЛ рднреА рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рджреНрд╡рд╛рд░рд╛ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдЗрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╣реИред рд╣рдо рдЗрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдпреВрдмреА рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдпрд╣ рднреА рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХреНрдпрд╛ рд╣реИ! рдпрд╣ рддрдереНрдп рдХрд┐ рдХрд╕реНрдЯрдо рдЗрдиреНрд╡реИрд░рд┐рдПрдВрдЯреНрд╕ рдХрд╛ рд╣реЛрдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ, рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рдПрдмреНрд╕рдЯреНрд░реИрдХреНрд╢рдиред рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд┐рдЦрд╛ рдерд╛ред

    рдХрд╕реНрдЯрдо, рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдФрд░ рдпреВрдмреА рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╡рд┐рджреЗрд╢реА рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЕрдкрдиреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред рдЗрд╕рд╕реЗ Vec рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рд╛рдорд╛рди рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЧрд▓рдд рдХрд╣рд╛ рдЕрдкреНрд░рд╛рдкреНрдд рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) - рд▓реЗрдХрд┐рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ ! рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг) &mut ZST рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ &mut ZST рдХрднреА рднреА рддрддреНрдХрд╛рд▓ UB рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЧрд▓рдд / рдирд┐рд░рд╛рдзрд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛред

рдЗрди рджреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП (рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕, рдбрд╛рдпрди рд▓рдХреНрд╖рдг), рдХрд╕реНрдЯрдо рдХреА рдкрд░рд┐рднрд╛рд╖рд╛, рдЕрд░реНрде рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдпреВрдмреА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдЧреЛрд▓рд╛рдХрд╛рд░ рд╣реЛрдЧреА рдпрджрд┐ рд╣рдо рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдпреВрдмреА рдХрднреА рдХрд╕реНрдЯрдо, рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рджреВрд╕рд░реЗ, рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реА рднрд╛рд╖рд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛, рдФрд░ рдХреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдЯреНрд░реЗрд╕ рдпреВрдмреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдирд┐рд░реНрдгрд╛рдпрдХ рд╕рдВрдкрддреНрддрд┐ рдереАред рд╕рд┐рдореЗрдВрдЯрд┐рдХ, рдХрд╕реНрдЯрдо рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдЕрдХреНрд╕рд░ рдирд┐рд░реНрдгрд╛рдпрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред


рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдЕрдиреБрдмрдВрдз рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреНрд╖реЗрддреНрд░ рдЧреЛрдкрдиреАрдпрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреИрд╕реЗ рд╣реИред

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдЬрдм рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдЪреБрдирддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╡рд╛рджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрднреА рднреА рдпреВрдмреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрдШ рджреЛрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рд╕реЗ рдПрдХ рдЪреАрдЬреЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИрдВ, рдЬреЛ рдХрд┐ рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдХреЗ

рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдШ ... рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рдкрдврд╝рдирд╛ рд╡реИрд╕реЗ рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рд╕рдВрдШ рдХреНрд╖реЗрддреНрд░ рд▓рд┐рдЦрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдШ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╕реНрдЯрдо рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ ...

рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрдкрдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ рд╡рд┐рджреЗрд╢реА рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдЗрд╕ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝ рд╕рдХрддрд╛ (рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ)ред рдпрд╣ рд╡рд┐рджреЗрд╢реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЙрд╕ рдХреЛрдб рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рд░реИрдк рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░, рд▓рдкреЗрдЯ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдореЙрдбреНрдпреВрд▓, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ "рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдорд╛рди" рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рдХ рдЙрдирдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛрдЧрд╛ред

рд╕рд╣реА рдмрд╛рддред (рдЖрддрдВрдХ-рд╕реБрд░рдХреНрд╖рд╛ рдпрд╣рд╛рдБ рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ)ред рдпрд╣ рдРрд╕рд╛ рд╣реА рд╣реИ, Vec , рдореИрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

let sz = self.size;
self.size = 1337;
self.size = sz;

рдФрд░ рдХреЛрдИ рдпреВрдмреА рдирд╣реАрдВ рд╣реИред


mod m {
    union MyPrivateUnion { /* private fields */ }
    extern {
        fn my_private_ffi_function() -> MyPrivateUnion; // Can return garbage (?)
    }
}

рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд▓реЗрдЖрдЙрдЯ рдЗрдВрд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, my_private_ffi_function рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ ABI рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдорд┐рд▓рд╛рди рдХреЛ рдорд╛рдирддреЗ рд╣реБрдП)ред рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдХрд╕реНрдЯрдо рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ - рдЬрд┐рд╕рдиреЗ рднреА рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд┐рдЦрд╛ рдерд╛ рдЙрд╕рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдПрдХ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдерд╛, рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рдЕрдкрдиреА рдпреВрдирд┐рдпрди рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ FFI рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЗрдирд╡реЗрд░рд┐рдпрди рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ ред

рдореИрдВрдиреЗ рдЕрдВрддрддрдГ рдЙрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ &mut T рдХрд╛ рдЖрд░рдВрднрд┐рдХ рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЪрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА https://github.com/rust-lang/rust/issues/55149 рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рд╣рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

E0658 рдЕрднреА рднреА рдпрд╣рд╛рдБ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рддреНрд░реБрдЯрд┐ [E0658]: рдЧреИрд░- Copy рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдпрди рдЕрд╕реНрдерд┐рд░ рд╣реИрдВ (рджреЗрдЦреЗрдВ рдореБрджреНрджрд╛ # 8188)

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд░рдорд╛рдгреБ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦреЗрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ Copy рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдХреЛ рднреА рдПрдХ рд╕рдорд╛рдзрд╛рди рдкрддрд╛ рд╣реИ?

рдЬрдм https://github.com/rust-lang/rust/issues/55149 рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рд╕рдВрдШ рдореЗрдВ ManuallyDrop<AtomicFoo> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВрдЧреЗред рддрдм рддрдХ, рдПрдХрдорд╛рддреНрд░ рдХрд╛рдо-рд░рд╛рддреНрд░рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ (рдпрд╛ union рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рдЦреЛрдЬреЗрдВ)ред

рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ ManuallyDrop рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП; рд╕рдм рдХреЗ рдмрд╛рдж рдЬрдВрдЧ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ Atomic* Drop рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдХреЛ рдирдП рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реМрдВрдкрдирд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Robbepop picture Robbepop  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SharplEr picture SharplEr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mcarton picture mcarton  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

behnam picture behnam  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

drewcrawford picture drewcrawford  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ