1

Dは、暗黙的な関数のインスタンス化中に最上位の配列のconstを破棄し、明示的なものの場合はそのままにします。コードを検討してください:

// main.d
import std.stdio;
void foo( T )( T val )
{
  writeln( typeid( T ) );
}
void main()
{
const int[] arr; writeln( typeid( arr ) ); // actual type foo( arr ); // implicit instantiation foo!( typeof( arr ) )( arr ); // explicit instantiation }
...そして出力:
$ dmd main.d && ./main
const(const(int)[])
const(int)[]
const(const(int)[])
ご覧のとおり、暗黙的なインスタンス化の場合、トップレベルのconstが失われました。このバグ、機能、または私の誤解ですか?

4

1 に答える 1

2

失われるのは、配列自体の constness ではなく、配列ポインターの constness です。

const int[]in D は、配列ポインター (別の配列を指すことはできません) と配列データ (要素を変更することはできません) の両方を保護します。そのため、1 番目と 3 番目の出力には 2constが含まれています。ただし、配列を関数に渡す場合、ポインターの定数を保持する必要はありません。val内部fooを別の配列に変更arrしても、main関数の内容には影響しません。

于 2012-07-29T19:24:57.437 に答える