表达式忽略不可变/ const?

时间:2015-07-14 04:07:14

标签: d dmd

我正在使用功能模板void _createAttr(T)(args..., in T[]),并在函数中使用T测试static if(is(T == char))的类型。当我打电话时,

_createAttr!char(args...,"someString")
_createAttr(args...,"someString")

编译器从不抱怨。

当然我知道alias string = immutable(char)[]。因此在第一次调用时,T的类型和提供的参数不匹配,但in修饰符应该处理它。在第二种情况下,它应推断T = immutable(char)。据我了解,immutable(char)char是不同的类型,但编译器在第二种情况下通过了is测试。

在进行is测试时,编译器(DMD)似乎忽略了字符串中字符的不可变性。

我在dlang.org或D编程语言书中找不到任何关于此行为的解释。

这是编译器错误吗?

1 个答案:

答案 0 :(得分:4)

没有错误,只是in限定词扩展为const,这同样适用于immutable(char)char,因此编译器只会实例化一次。

如果T == char,则in T[]表示涵盖这两种情况的const char[],因此模板永远不需要考虑不变性。您也可以将一个可变字符串传递给该函数,没有任何问题。

如果你明确地做了!(immutable(char))那么它会使用它,并且不再接受可变的那个。