イグトランス様の仰るとおり、文字列直定数はString型よりもむしろBytePtr型と考える方が妥当であることが判明しましたので、報告いたします。
・根拠
次の2つのコードをコンパイルしたとき、ほぼ同様のコードが生成される。
コード: 全て選択
Dim b As BytePtr, s As String
b = "Literal"
s = b
コード: 全て選択
Dim s As String
s = "Literal"
前者はポインタ変数bの値が利用されるのに対し、後者はリテラルが格納されているアドレスが直接利用されます。
(僕の予想に大きく反して)これだけの違いしかありませんでした。
結局、コンパイラは文字列直定数をByte型の配列としか認識せず、通常はBytePtr型を使うようです。
文字列直定数、例えば、"\r\0\n\0\r\n\0 \0\t\0\0"の場合
0F 00 00 00 0D 00 0D 0A 00 0D 0D 0A 00 20 00 09 00 00 00 といった具合に、文字列リテラルの前には必ずサイズを保持する32ビット値がついていると思っていたのですが、コンパイラは僕の期待したように扱ってはくれず、ただ単に最初に現れる 00 を文字列の終端と見なしてしまうために予期しない動作をしてしまいます。
> \0を含んだ文字がStringでうまく扱えないとしてもStringにそこまで求めるほうがまずいのであって、
イグトランス様のこの発言は見事に的を射ています。
> 別に'\0'区切り"\0\0"終端の文字列の並びを扱うクラスを用意すべきではと思っています。
もっともです。僕はまだオブジェクト指向の本質が見えていないので、この発想は出てきませんでした。
なるほど、と頷くことしかできないのが悔しいです。