如何在 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 int 数组?

ES6浅谈--const,数组解构

初始化静态 const char* 数组

如何更改静态链接库中 const 字符串数组的 Visual Studio C++ 初始化序列

如何在 C++ 类中创建 const 数组和计算 const 值?

ES6 - 基础学习: const关键字的本质