如何在 D2 中初始化一个 const 值数组?
Posted
技术标签:
【中文标题】如何在 D2 中初始化一个 const 值数组?【英文标题】:How do you initialise an array of const values in D2? 【发布时间】:2010-09-02 12:24:01 【问题描述】:基本上,我希望能够做这样的事情:
struct Foo
const(int)[2] ints;
this(int x, int y)
ints = [x, y];
但这不起作用。编译器 (DMD 2.048) 只是抱怨 ints
不可变。
你应该如何初始化数组?
【问题讨论】:
如果将整数定义为动态数组: const(int)[] ints;分配按预期工作-您应该能够重新绑定整数。问题是静态数组的行为是否被定义为相同,如果是,那么这是一个错误。 嗯,我想应该是这样,否则就没有const
值的静态数组。
要求对 d 新闻组进行澄清 digitalmars.com/pnews/…
这不是错误。静态数组 (ints) 是值类型并且没有任何间接性,因此类型 const(int)[2] 和 const(int[2]) 具有相同的行为 - 与动态数组不同。
Michal,你在新闻组上问了一个完整的无关问题。我的问题是关于初始化,而不是重新绑定。它们是完全不同的东西。显然你不能重新绑定一个 const 数组(它是 const!),但你应该能够初始化它(否则,如果你不能使用它,为什么还要有一个类型!?)。
【参考方案1】:
一种方法是实现构造函数是这样的:
this(int x, int y)
auto i2 = cast(int[2]*)&ints;
*i2 = [x, y];
const 是只读视图,因此构造函数创建可变视图i2
并分配给它。我真的不喜欢第一行的强制转换,也许标准库中有一些函数封装了强制转换并从变量类型中删除了 const 修饰符,所以这可以用安全和惯用的方式表达。
第二种方法是使ints
可变且私有,然后提供公共访问器功能:
struct Foo
private int[2] _ints;
this(int x, int y)
_ints = [x, y];
@property ref const(int)[2] ints ()
return _ints;
编译器可能能够内联它。
【讨论】:
感谢您的回复。请注意,我实际上并不打算让它公开可见——我只是保持代码简单以说明问题:) 你的意思是好的,但你做的不好 - 我很确定你很清楚提高代码的可见性会增加程序的复杂性 ;)以上是关于如何在 D2 中初始化一个 const 值数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何更改静态链接库中 const 字符串数组的 Visual Studio C++ 初始化序列