Rustのバイト列リテラルの型
Rustのリテラルの型検査は check_lit にある。これによると、文字列リテラルの型は &'static str である一方、バイト列リテラルの型は &'static [u8] ではなく、 &'static [u8; N] である。
そのため、以下のようなコードがコンパイルできる。
fn main() { let x : &[u8; 5] = b"Hello"; let y : [u8; 5] = *b"Hello"; }
なお、 b"Hello" は、 &[72, 101, 108, 108, 111] と等価ではない。数値リテラルが u8 とは限らないという点のほかに、生存期間が異なる。
fn main() { let x : &'static [u8] = b"Hello"; let y : &'static [u8] = &[72, 101, 108, 108, 111]; }
rustc 1.20.0-nightly (3bfc18a96 2017-06-29) error[E0597]: borrowed value does not live long enough --> <anon>:3:30 | 3 | let y : &'static [u8] = &[72, 101, 108, 108, 111]; | ^^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough 4 | } | - temporary value only lives until here | = note: borrowed value must be valid for the static lifetime... error: aborting due to previous error(s)
生存期間を考慮すると、 b"Hello" はおよそ以下のように脱糖されると考えられる。
fn main() {
let x : &'static [u8] = b"Hello";
let y : &'static [u8] =
{ static S : [u8; 5] = [72, 101, 108, 108, 111]; &S };
}