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

丢失的是数组指针的常量——而不是数组本身的常量。

const int[]in D 保护数组指针(您不能将其指向不同的数组)和数组数据(您不能更改元素)。这就是为什么第一个和第三个输出中有 2const秒。但是,当您将数组传递给函数时,不需要保持指针的常量性 - 如果您将val内部更改foo为不同的数组,它不会影响函数arr中的内容。main

于 2012-07-29T19:24:57.437 回答