我正在使用功能模板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编程语言书中找不到任何关于此行为的解释。
这是编译器错误吗?
答案 0 :(得分:4)
没有错误,只是in
限定词扩展为const
,这同样适用于immutable(char)
和char
,因此编译器只会实例化一次。
如果T == char
,则in T[]
表示涵盖这两种情况的const char[]
,因此模板永远不需要考虑不变性。您也可以将一个可变字符串传递给该函数,没有任何问题。
如果你明确地做了!(immutable(char))
那么它会使用它,并且不再接受可变的那个。