【发布时间】:2014-09-24 09:25:39
【问题描述】:
例如,我想用这个签名编写一个函数:int foo(char[]) 并使用char[5] x; foo(x) 调用它。
目前我收到一个编译错误,指出 char[] 与 char[5] 不同。
我想写:int foo(uint SIZE)(char[SIZE]),但是我必须在调用 foo 时显式设置长度:foo!5(x) 之前的示例。
编辑:你们是对的,我的函数实际上看起来像foo(ref char[]),我已经声明了它@nogc。我想要做的是用数据填充给定的静态数组。
从更广泛的意义上说,我正在尝试实现一个退化的format 函数,因为标准库肯定在使用 GC,而我不能从我的其他非 GC 代码中调用它。对此也有什么想法吗?
【问题讨论】:
-
静态数组应该可以隐式转换为动态数组,编译器也可以推断出 SIZE 参数
-
见底部Arrays。正如@ratchetfreak 所说,
T[dim]隐式转换为T[]。你能发布一个产生这个错误的例子吗? -
确实不应该允许隐式转换(除非存在范围转义分析,但事实并非如此) - 它很容易在许多情况下导致崩溃,并且起到打破不变性保证的作用!这是规范中内存安全的一个巨大漏洞,应该修复 - 不要依赖它。相反,当您知道它是安全的(例如将数组传递给不会存储它的函数)时,使用切片运算符显式切片:
foo(x[]) -
@ratchetfreak - 这是怎么回事?我应该省略尺寸吗?
标签: garbage-collection d static-array