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 }; }